开始正式生成证书
1.创建CA私钥: ca.key
openssl genrsa -out ca.key 1024
2.创建根证书请求文件ca.csr:
openssl req -new -out ca.csr -key ca.key
这里需要填入配置信息:
Country Name (2 letter code) [AU]:cn 国家名(2个字母的代号)
State or Province Name (full name) [Some-State]:cq 省
Locality Name (eg, city) []:cq 市
Organization Name (eg, company) [Internet Widgits Pty Ltd]:gs 公司名
Organizational Unit Name (eg, section) []:gs 组织或部门名
Common Name (eg, YOUR name) []:doris_ca 域名或自己名字(ca证书不要用跟服务端证书或者客户端证书一个common name 会报错!)
Email Address []: 邮箱地址(不填直接回车)
A challenge password []:123456 密码
An optional company name []:gs 公司名
3.自签根证书ca.cer:
openssl x509 -req -in ca.csr -out ca.cer -signkey ca.key -CAcreateserial -days 3650
4.【这一步可做可不做】生成p12格式根证书ca.p12(密码填写123456,之前ca.csr的密码,ps:这里输入的时候是不可见的输入完成后回车即可)
openssl pkcs12 -export -clcerts -in ca.cer -inkey ca.key -out ca.p12
5.生成服务端私钥key server.key:
openssl genrsa -out server.key 1024
6.生成服务端请求文件 server.csr
openssl req -new -out server.csr -key server.key
填入证书配置信息:
Country Name (2 letter code) [AU]:cn 国家名(2个字母的代号)
State or Province Name (full name) [Some-State]:cq 省
Locality Name (eg, city) []:cq 市
Organization Name (eg, company) [Internet Widgits Pty Ltd]:gs 公司名
Organizational Unit Name (eg, section) []:gs 组织或部门名
Common Name (eg, YOUR name) []: *.test.com【适用于a.test.com ,b.test.com 等等】(尽量用服务器域名,不然会引起服务器警告,如果都是批量后缀的域名。建议用通配符域名)
Email Address []: 邮箱地址
A challenge password []:123456 密码
An optional company name []:gs 公司名
server.csr
7.生成服务端证书server.cer(ca.cer,ca.key,servr.key,server.csr这4个生成服务端证书):
openssl x509 -req -in server.csr -out server.cer -signkey server.key -CA ca.cer -CAkey ca.key -CAcreateserial -days 3650
8.生成客户端key client.key:
openssl genrsa -out client.key 1024
9.生成客户端请求文件client.csr:
openssl req -new -out client.csr -key client.key
填入证书配置信息:
Country Name (2 letter code) [AU]:cn 国家名(2个字母的代号)
State or Province Name (full name) [Some-State]:cq 省
Locality Name (eg, city) []:cq 市
Organization Name (eg, company) [Internet Widgits Pty Ltd]:gs 公司名
Organizational Unit Name (eg, section) []:gs 组织或部门名
Common Name (eg, YOUR name) []:ssl_doriszheng 签发机构\开发者人员(这里随意)
Email Address []: 邮箱地址
A challenge password []:123456 密码
An optional company name []:gs 公司名
10.生成客户端证书 client.cer:
openssl x509 -req -in client.csr -out client.cer -signkey client.key -CA ca.cer -CAkey ca.key -CAcreateserial -days 3650
11.【可做可不做】生成客户端p12格式根证书client.p12(密码设置123456):
openssl pkcs12 -export -clcerts -in client.cer -inkey client.key -out client.p12
至此,证书就制作完毕了:
服务器端配置(详细配置过程可见:https://www.jianshu.com/p/bbf853fc28f3):
server {
listen 443 ssl; #http的端口号是80,https的端口为443
server_namewww.test.com#服务器域名 配置多个时不要添加;号即可
ServerName 127.0.0.1
ServerName 192.168.0.111;
ssl on; #开启ssl
ssl_certificate C:\Users\Administrator\Desktop\ssl4\server.cer; #服务器证书文件
ssl_certificate_key C:\Users\Administrator\Desktop\ssl4\server.key; #服务器证书密匙
ssl_client_certificate C:\Users\Administrator\Desktop\ssl4\ca.cer; #根证书
ssl_verify_depth 1;
ssl_verify_client on; #开启客户端验证
location / {
root F:\PHPStudy\PHPTutorial\WWW; #本地网站文件目录
index index.HTML index.html index.htm ;
}
}
如何判断双向校验成功
curl -vvvv --request GET --header "Content-Type: application/json" --cacert /Users/doris/Downloads/ssl_new/ca.cer --cert /Users/doris/Downloads/ssl_new/client.cer --key /Users/doris/Downloads/ssl_new/client.key --pass NgnCert1234 "https://a.test.com"
--cacert ca证书 【第三个步骤生成】
--cert 客户端证书 【第十个步骤生成】
--key 客户端私钥 【第八个步骤生成】
问题1:curl: (60) SSL certificate problem: unable to get local issuer certificate
curl -vvvv --request GET --header "Content-Type: application/json" "https://test.ioa.tencent.com/test"
原因:请求没有带上ca证书,无法校验服务器的证书
解决方法1:
curl 加上-cacert ca证书 校验服务器证书
curl -vvvv --request GET --header "Content-Type: application/json" --cacert /Users/doris/Downloads/ssl_new/ca.cer --cert /Users/doris/Downloads/ssl_new/client.cer --key /Users/doris/Downloads/ssl_new/client.key --pass NgnCert1234 "https://a.test.com"
解决方法2:
curl 加上-k 可以不校验服务器证书。
curl -k -vvvv --request GET --header "Content-Type: application/json" --cert /Users/doris/Downloads/ssl_new/client.cer --key /Users/doris/Downloads/ssl_new/client.key --pass NgnCert1234 "https://a.test.com"
问题2:error 18 at 0 depth lookup:self signed certificate
网上给出的答复是:
Whatever method you use to generate the certificate and key files, the Common Name value used for the server and client certificates/keys must each differ from the Common Name value used for the CA certificate. Otherwise, the certificate and key files will not work for servers compiled using OpenSSL.
When OpenSSL prompts you for the Common Name for each certificate, use different names.
解决方案:
当你在创建ca.csr, server.csr, client.csr时 要求你填写的 Common Name。
ca.csr 的common name 不能和server.csr, client.csr填的相同
参考文档链接:https://www.jianshu.com/p/094c7fc8cb85,感谢作者CQ_TYL