2019独角兽企业重金招聘Python工程师标准>>>
环境
系统:archlinux/centOS nginx:nginx/1.12.2 浏览器:火狐firefox 前提:1.安装nginx。 2.安装openssl。 |
生成证书
新建工作目录
首先建立一个工作目录,这里以我的工作目录为例。(/home/yinghui/ssl/demoCA-my/),然后执行如下命令。建立生成证书的路径文件结构,这是由openssl的默认配置文件决定的。你可以修改配置。
mkdir demoCA-my cd demoCA-my touch ./{serial,index.txt} echo '01' > serial mkdir ./newcerts
配置 openssl.cnf
拷贝配置文件到工作目录。当然前缀路径要换成你自己的。
cp /usr/local/ssl/openssl.cnf ./
修改配置文件。编辑openssl.cnf中的一些选项。
unique_subject = no (这样一个CA可以同时签多张证书) countryName = optional(把这些参数的匹配规则改为可选) stateOrProvinceName = optional organizationName = optional organizationalUnitName = optional |
效果:
修改dir配置:注意是CA_default 下面的dir
生成CA跟证书
现在我们来生成自己的CA跟证书
openssl req -days 365 -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf
生成会话会让你填入一些参数,根据实际情况填写。执行完会发现工作目录下会有ca.crt ca.key两个文件。截图如下:
大概说明一下上面各项的意思:
输入项 | 解释 | 值 |
AU | 国籍 | cn |
state or province | 州 省份 | beijing |
Lcality Name | 城市 | bj |
O name(简写) | 公司 | jinxi |
O U name(简写) | 组织 | jinxi360 |
common name | 通用名 | 网址或者你的名字 |
你的邮箱 | 略 |
结果多了两个文件:
生成server端证书
首先生成server端私钥。执行后会要求输入解析私钥文件的密码。生成server.key。
openssl genrsa -des3 -out server.key 1024
生成证书请求
生成会话会提示输入一些请求信息,成功后生成server.csr
openssl req -new -key server.key -out server.csr -config openssl.cnf
注意上图中画线的一行,这行输入server端的域名(或者IP地址),这里是https://192.168.1.100 。否则签发的服务端证书会被浏览器视为不是本站点的证书,最后两项我这里直接回车。其他参考上面的解释。
执行后多出一个文件server.csr
现在用生成的CA给证书请求(server.csr)签发证书(crt文件)。根据提示输入相关密码(之前设置好的)和两个 y(yes)回车,成功后生成证书server.crt
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
生成的服务端证书文件:
到这里,我们已经可以做单项认证了,来试试。
验证单向认证
配置nginx:vi /usr/local/nginx/conf/nginx.conf修改配置如下图(注意证书和CA的路径是我的工程路径):
server {listen 443;#server_name abc.jinxi360.com;ssl on; ssl_certificate /home/yinghui/ssl/demoCA-my/server.crt; #服务端证书ssl_certificate_key /home/yinghui/ssl/demoCA-my/server.key; #服务端私钥ssl_client_certificate /home/yinghui/ssl/demoCA-my/ca.crt; #跟CA证书ssl_session_timeout 5m;ssl_verify_client on; #开户客户端证书验证ssl_prefer_server_ciphers on;#add_header Strict-Transport-Security 'max-age=31536000';#access_log /var/log/nginx/adm_access.log;#error_log /var/log/nginx/adm_error.log;location / {root html;index index.html index.htm;} }
保存后验证 nginx.conf配置文件:
启动nginx
会要求输入server端私钥文件解析密码,输入生成时设置的密码。
在windows下打开firefox输入https://192.168.1.100回车。
这说明nginx已经向浏览器发送了自己的证书,但是这个证书不受信任。别急,现在我们把之前自己的CA导入浏览器。
打开 选项->高级->查看证书->证书机构->导入。先择CA后根据提示导入证书。成功后如下:
再次输入https://192.168.1.100回车。
看见中间那行提示了吗?中式英语翻译过来就是-->没有要求的ssl证书来发送。也就是说,client已经成功认证了server端的证书,但是我们配置nginx为双向认证,所以nginx要求浏览器出示证书,而浏览器没有证书。
说明单项认证已经OK,现在为client生成证书。
生成client证书
首先生成client端私钥,执行后会要求输入解析私钥文件的密码,根据个人喜好设置。生成client.key。
openssl genrsa -des3 -out client.key 1024
生成证书请求。生成会话会提示输入一些请求信息,成功后生成client.csr。
openssl req -new -key client.key -out client.csr -config openssl.cnf
上图中画线的是证书在浏览器中显示的名字,这里使用域名地址作为证书的名称,上面最后两项我直接回车。
生成客户端crt证书:
现在用之前生成的CA给证书请求(client.csr)签发证书。根据提示输入相关密码(之前设置好的)和y(yes),成功后生成证书client.crt
openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
生成p12证书:
firefox要求客户端的证书格式是p12格式,所以我们把client.crt转化为client.p12格式
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
转pem格式
cat ca.crt ca.key > ca.pem cat server.crt server.key > server.pem cat client.crt client.key > client.pem
最后一步,把client.p12导入浏览器。
打开 选项->高级->查看证书->您的证书->导入。根据提示导入,导入成功后如图:
查看证书信息:
输入https://192.168.68.173:8080回车。
OK!!!
go go go!
附:
最终目录下的文件列表: