创建自己的CA证书

1、生成CA私钥

openssl genrsa -out ca.key

默认算法RSA,密钥长度2048位。

2、生成CA证书

openssl req -out ca.crt -key ca.key -x509 -days 730

参数解释:
-x509:输出x509证书,而不是一个证书请求文件。
-days:指定证书剩余天数。

openssl会提示输入一些证书的基本信息,比如地区、组织等信息,如果不填写则采用默认值,默认值来自于配置文件openssl.cnf
如果想指定自己的配置文件则可以用-config参数,指定配置文件路径即可,如-config my.cnf
如果只是想简单地指定几个证书信息又不想按提示或用配置文件,则可以用-subj参数,比如

openssl req -out ca.crt -key ca.key -x509 -days 730 -subj "/C=CN/ST=BeiJing/L=BeiJing/O=MyCA/CN=MyCA/emailAddress=10000@qq.com"

字段解释:
/C:国家代码,两个字母,比如CN。 /ST:省份
/L:城市
/O:颁发者、公司、组织
/OU:部门
/CN:颁发给、域名
/emailAddress:email地址

我们查看证书时最直观看到的就是 颁发者颁发给 这两项了。

3、导入根证书到计算机的"受信任的根证书颁发机构"。管理员方式运行命令

CertUtil -addstore root ca.crt

注:CertUtil.exe是Windows系统自带的一个证书管理实用工具。
或者也可以直接双击ca.crt文件,根据向导来一步步安装证书到系统。

4、查看证书库,检查是否导入成功。运行命令

certlm.msc

certlm.msc用于查看计算机的证书存储库。另一个命令certmgr.msc用于查看用户的证书存储库。

用自己的CA颁发证书

1、准备一个配置文件server.cnf,因为证书的某些扩展信息无法通过参数传递,必须使用文件

[req]
distinguished_name = req_distinguished_name

[req_distinguished_name]
countryName                     = Country Name (2 letter code)
countryName_default             = US
stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName_default     = California
localityName                    = Locality Name (eg, city)
localityName_default            = San Francisco
organizationName                = Organization Name (eg, company)
organizationName_default        = Google
organizationalUnitName			= Organizational Unit Name (eg, section)
organizationalUnitName_default  = IT
commonName                      = Common Name (e.g. server FQDN or YOUR name)
commonName_default              = example.com

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = example.com
DNS.2 = *.example.com

域名等信息根据自己的需要修改即可。

2、生成SSL证书私钥

openssl genrsa -out server.key

3、生成证书请求文件

openssl req -new -key server.key -out server.csr -config server.cnf

参数解释:
-new:新请求。
-key:私钥文件。
-out:生成的请求文件。
-config:配置文件。

这一步openssl会提示输入地区、组织等信息,如果想让其不询问而直接使用配置文件里的值,则需要修改配置文件为

[req]
prompt = no
distinguished_name = req_distinguished_name_no_prompt

[req_distinguished_name_no_prompt]
countryName            = US
stateOrProvinceName    = California
localityName           = San Francisco
organizationName       = Google
organizationalUnitName = IT
emailAddress           = 10000@qq.com
commonName             = example.com

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = example.com
DNS.2 = *.example.com

注意在req节中添加了一句prompt = no,它表示不询问用户,直接读取文件中的值。
然后将原来的req_distinguished_name替换为了req_distinguished_name_no_prompt,当然这个节的名字是可以随意修改的。

4、颁发证书

openssl x509 -req -CA ca.crt -CAkey ca.key -in server.csr -out server.crt -CAcreateserial -extfile server.cnf -extensions v3_req

参数解释:
-ca:CA证书文件。
-CAkey:CA私钥文件。
-in:SSL证书请求文件。
-out:生成的SSL证书文件。
-CAcreateserial:序列号文件不存在时创建一个。
-extfile:证书扩展信息,证书的版本将变为v3。
-extensions:扩展文件中扩展字段名称。