原创

openssl生成ca证书配置ssl双向认证

nginx https配置,通常情况下只需要实现服务端认证就行,因为浏览器内置了一些受信任的证书颁发机构(CA),服务器端只需要拿到这些机构颁发的证书并配置好,浏览器会自己校验证书的可用性并通过SSL进行通讯加密。但特殊情况下我们也需要对客户端进行验证,只有受信任的客户端才能使用服务接口,此时我们就需要启用双向认证来达到这个目的,只有当客户端请求带了可用的证书才能调通服务端接口。


CA证书只有权威机构才可以做,并且如果该机构达不到安全标准也会被浏览器厂商“封杀”。不过这些并不影响进行双向认证配置,因为双向认证我们在这里使用CA采用的是自签名方式。


首先切换至nginx ssl目录下进行证书制作:

制作CA私钥openssl genrsa -out ca.key 2048

[root@ua-app1 ssl]# openssl genrsa -out ca.key 2048
Generating RSA private key, 2048 bit long modulus
......................................................................................+++
..................+++
e is 65537 (0x010001)


制作CA根证书(公钥)openssl req -new -x509 -days 3650 -key ca.key -out ca.crt

[root@ua-app1 ssl]# openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:zhongguo 
string is too long, it needs to be less than  2 bytes long
Country Name (2 letter code) [AU]:zh
State or Province Name (full name) [Some-State]:hb
Locality Name (eg, city) []:ts
Organization Name (eg, company) [Internet Widgits Pty Ltd]:bt
Organizational Unit Name (eg, section) []:kf
Common Name (e.g. server FQDN or YOUR name) []:www.yoodb.cn
Email Address []:afreon@163.com

注意:

Common Name (e.g. server FQDN or YOUR name) []:此项可以随意填写,其他需要填写的信息也是任意。


服务器端证书

制作服务端私钥

openssl genrsa -out server.pem 1024

[root@ua-app1 ssl]# openssl genrsa -out server.pem 1024
Generating RSA private key, 1024 bit long modulus
...................++++++
.++++++
e is 65537 (0x010001)

openssl rsa -in server.pem -out server.key

[root@ua-app1 ssl]# openssl rsa -in server.pem -out server.key
writing RSA key
openssl rsa -in server.pem -out server.key


生成签发请求openssl req -new -key server.pem -out server.csr

[root@ua-app1 ssl]# openssl req -new -key server.pem -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:hb
Locality Name (eg, city) []:ts
Organization Name (eg, company) [Internet Widgits Pty Ltd]:bj
Organizational Unit Name (eg, section) []:kf
Common Name (e.g. server FQDN or YOUR name) []:blog.yoodb.com
Email Address []:afreon@163.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


注意:

Common Name (e.g. server FQDN or YOUR name) []:必须填写访问服务时的域名,这里使用blog.yoodb.com,其他需要填写的信息任意(可以和CA根证书匹配)


用CA签发openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt

[root@ua-app1 ssl]# openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt
Signature ok
subject=C = cn, ST = hb, L = ts, O = bj, OU = kf, CN = blog.yoodb.com, emailAddress = afreon@163.com
Getting CA Private Key


客户端证书(和服务端类似)

制作客户端私钥

openssl genrsa -out client.pem 1024

[root@ua-app1 ssl]# openssl genrsa -out client.pem 1024
Generating RSA private key, 1024 bit long modulus
......++++++
.........................................++++++
e is 65537 (0x010001)

openssl rsa -in client.pem -out client.key

[root@ua-app1 ssl]# openssl rsa -in client.pem -out client.key
writing RSA key


生成签发请求openssl req -new -key client.pem -out client.csr

[root@ua-app1 ssl]# openssl req -new -key client.pem -out client.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:hb
Locality Name (eg, city) []:ts
Organization Name (eg, company) [Internet Widgits Pty Ltd]:bt
Organizational Unit Name (eg, section) []:kf
Common Name (e.g. server FQDN or YOUR name) []:blog.yoodb.com
Email Address []:afreon@163.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

注意:

Common Name (e.g. server FQDN or YOUR name) []:必须填写访问服务时的域名,这里使用blog.yoodb.com,其他需要填写的信息任意(可以和CA根证书匹配)


用CA签发openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt

[root@ua-app1 ssl]# openssl x509 -req -sha256 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out client.crt
Signature ok
subject=C = cn, ST = hb, L = ts, O = bt, OU = kf, CN = blog.yoodb.com, emailAddress = afreon@163.com
Getting CA Private Key

由于是双向认证,直接通过浏览器访问https地址是会报400 Bad Request(No required SSL certificate was sent)错误的,需要在本机安装client证书。

openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.pfx

[root@ua-app1 ssl]# openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.pfx
Enter Export Password:
Verifying - Enter Export Password:

安装成功后,重启IE浏览器(其他浏览器忽略,哈哈)输入网址访问,浏览器可能会提示你选择证书,选择刚才安装的client.pfx证书即可。

注意:

分别将client.crt证书导入到受信任的跟证书颁发机构里面和client.pfx证书导入到个人证书。


nginx配置信息

server {
    listen       443 ssl;
    server_name  blog.yoodb.com;
    ssl on;
    ssl_certificate /usl/local/nginx/ssl/server.crt;
    ssl_certificate_key /usl/local/nginx/ssl/server.key;
    ssl_client_certificate /usl/local/nginx/ssl/ca.crt;
    ssl_verify_client on;
    location / {
        ....
    }
}

其中ssl_client_certificate /usl/local/nginx/ssl/ca.crt;是使用CA证书来验证请求带的客户端证书是否是该CA签发的。配置完成后,重启nginx服务器service nginx reload,到这里nginx ssl双向认证已经完成了。

关注下方微信公众号“Java精选”(w_z90110),回复关键字领取资料:如HadoopDubboCAS源码等等,免费领取资料视频和项目。 

涵盖:程序人生、搞笑视频、算法与数据结构、黑客技术与网络安全、前端开发、Java、Python、Redis缓存、Spring源码、各大主流框架、Web开发、大数据技术、Storm、Hadoop、MapReduce、Spark、elasticsearch、单点登录统一认证、分布式框架、集群、安卓开发、iOS开发、C/C++、.NET、Linux、Mysql、Oracle、NoSQL非关系型数据库、运维等。

评论

分享:

支付宝

微信