Nginx配置双向认证以及证书文件的制作流程
ssl协议
-
ssl协议在传输过程中使用了对称加密和非对称加密的方式
-
对称加密使用的是相同的秘钥进行加密,有加密速度快的特点
-
非对称加密使用的则是秘钥对(公钥和私钥)的方式进行加密,相对对称加密的单秘钥拥有更加安全的特点,但是缺点就是加密速度慢
证书格式之间的问题
-
CRT:crt意为certificate的简略写法,也就是证书的意思
-
KEY:key格式的文件为秘钥,也可以有PEM和DER格式的,都为秘钥文件
-
CSR:csr文件为证书签名请求文件,该文件可以理解为公钥,同时生成该文件的时候需要定义国家组织机构和域名等信息
一 .制作CA证书
1.生成CA的私钥
openssl genrsa -out ca.key 4096
生成ca.key
2.通过CA私钥来生成CA证书
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
生成CA证书文件ca.crt
其中需要填写一些信息,国家信息,省份,公司或机构名称,常用名称
二 .制作服务端证书
1.生成服务端私钥
openssl genrsa -out server.key 4096
2.生成服务端的证书请求文件(CSR)
openssl req -new -key server.key -out server.csr
其中也需要添加一些组织机构信息,这里需要注意的是,这里的Common Name如果服务器使用的是域名访问就一定要填写域名,如果是ip就要写对应的ip地址,其余的信息可以为空
3.使用CA签发的证书和私钥生成服务端证书文件(CRT)
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650
–ps 如果不加days参数,默认证书的有效期为一个月
–这样服务端所需的相关文件就生成完毕了
三 .制作客户端证书
1.生成客户端秘钥
openssl genrsa -out client.key 4096
2.生成客户端的请求文件
openssl req -new -key client.key -out client.csr
同理,这里面也需要配置一些参数,这里的组织和Common Name可以根据客户端来自行设置
3.使用CA证书和秘钥签名生成客户端证书
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365
完成上面的步骤之后,我们当前文件夹下就会有这些文件,接下来就要对这些文件进行配置
四.服务端证书配置
由于要配置ssl,所以nginx需要加载https的相关模块
nginx文件配置
server {
listen 5443 ssl; #端口号,改成需要的
server_name 114.96.103.22; # 对外暴露的服务地址
ssl_certificate /opt/nginx/keys/server.crt; # crt文件
ssl_certificate_key /opt/nginx/keys/server.key; # key文件
ssl_protocols TLSv1.2 TLSv1;
ssl_verify_client on; #开启双向认证
ssl_verify_depth 2;
ssl_client_certificate /opt/nginx/keys/ca.crt;
location /test {
default_type text/html;
return 200 "success"; # //要反向代理的服务地址
}
}
-
这里需要注意的是双向认证的配置项,如果要开启的话则还必须要配置ca.crt 也就是ca证书,否则无法启用
-
同时在开启双向认证后,在客户端不携带证书访问服务端时就会报400错误,如果不开启双向认证,客户端可以正常访问服务端,只是会出现证书不受信任的安全提示
五.客户端证书配置和请求配置
- 当配置了双向认证之后,客户端访问需要携带证书所以客户端需要进行配置
1.当客户端为命令行时
-
当不携带证书访问时为400
-
携带证书访问,可以看到响应为200
-
当为单向认证的时候可以通过curl -v -k https://xxx.xxxx.xxx/xx 命令忽略证书请求
2.当客户端为nginx时
-
当我们通过nginx去访问另一个双向认证的地址时候就需要在nginx的请求中携带证书,具体配置如下
-
然后通过本地的端口去访问服务器,可以发现也是可以访问成功的
3.客户端为浏览器时
-
最后就是通过浏览器来访问我们的服务端了,浏览器访问首先需要对客户端证书进行一下转换,将key和crt转换为p12格式的证书,可供浏览器直接安装
-
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
-
当进行证书转化的时候会提示输入客户端的密码,这里可以不输入,这样在导入时候也可以直接回车不进行输入。如果在这里输入了密码,在导入的时候也要输入对应的密码才能进行导入
-
导入之后即可查看证书
-
测试访问服务端,一切ok