创建自己的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:扩展文件中扩展字段名称。