nginx 配置 https 的双向认证

标签: nginx https 认证 | 发表时间:2015-01-27 06:31 | 作者:lwg2001s
分享到:
出处:http://www.iteye.com

SSL 的双向认证就是,客户端要获取服务端的证书,检查下服务端是不是我可以信任的主机,否则我就认为那个站点的内容不可信任,不应该去访问你(浏览器会告诉你),同时服务端也要检查客户端的证书,客户端如果不是服务端所信任的,那服务端也会认为,你不是我的合法用户,我拒绝给你提供服务。所以,要让 HTTPS 的双向认证顺利完成,就要在服务端给定一个证书,这个证书是浏览器可信任的,同时客户端(浏览器)也要发送给服务端一个证书,服务器端也要信任这个证书。

要想让浏览器纯自然地就去信任服务端的证书,那服务端所使用的证书就得是那几大已经被大家所信任的证书机构给他签名,不过一般要钱…不好

如果自己担当证书机构(Certificate Authority, CA)的角色的话,可以这么搞。

1、准备CA密钥

通常是在 linux 用 openssl 命令来搞,不过 Windows 下也可以,装个 Git 一般会带上 windows 的编译版本了。

openssl genrsa –out ca-key.pem 2048

2、生成CA证书请求

证书请求都是根据私钥来生成的

openssl req –new –key ca-key.pem –out ca-req.csr –days 3650

 

 

3、签名CA证书请求

使用自己的私钥来给这个CA证书请求签名

openssl x509 –req –in ca-req.csr –out ca-cert.pem –signkey ca-key.pem –days 3650

4、CA证书转换为DER格式

DER 格式似乎更加通用,iOS 直接认

openssl x509 –in ca-cert.pem –out ca.der –outform DER

现在,终于拿到了自己做 CA 需要的几个文件了,密钥 ca-key.pem,证书 ca-cert.pem,系统使用的 ca.der,接下来,要创建一个网站,就需要让 CA 给他签名一个证书了

6、准备网站密钥

网站自己也需要准备一个密钥,类似于 CA,假如这个网站的域名是 su.su

openssl genrsa –out su-key.pem 2048

7、生成网站证书请求

网站通过密钥生成证书请求,当然,这个请求一般是要提交给 CA,让 CA 进行签名的

openssl req –new –key su-key.pem –out su-req.csr –days 3650

8、CA签名网站证书请求

不是拿到 CA 的证书了就可以说自己是 CA 的,最重要的是,签名需要有 CA 密钥

openssl x509 –req –in su-req.csr –out su-cert.pem –days 3650 –CA ca-cert.pem –CAkey ca-key.pem –CAcreateserial

如果客户端(个人浏览器)信任 CA 的证书的话,那么他也就会信任由 CA 签名的网站证书,因此让浏览器信任 CA 的证书之后,客户端就自然信任服务端了,只要做单向认证的话,到这一步证书这一类材料就已经准备好了,但是双向认证就还要给客户端(个人的浏览器)准备一份证书,让服务端可以知道客户端也是合法的。假如让服务端也信任 CA 的证书,那 CA 签名的客户端证书也就能被信任了。

9、准备客户端私钥

不变的方法不需要解释

openssl genrsa –out qiyi-key.pem 2048

10、生成客户端证书请求

不变的方法不需要解释

openssl req –new –key qiyi-key.pem –out qiyi-req.csr –days 3650

11、CA签名客户端证书请求

不变的方法不需要解释

openssl x509 –req –in qiyi-req.csr –out qiyi-cert.pem –days 3650 –CA ca-cert.pem –CAkey ca-key.pem –CAcreateserial

12、客户端证书转换为DER格式

不变的方法不需要解释

openssl x509 –in qiyi-cert.pem –out qiyi.der –outform DER

13、客户端证书转换为 PKCS #12格式

全称应该叫做 Personal Information Exchange,通常以 p12 作为后缀

openssl pkcs12 –export –clcerts –in qiyi-cert.pem –inkey qiyi-key.pem –out qiyi.p12

14、配置 nginx

比如,类似下面这样一段

  1. server {
  2.     listen       443;
  3.     server_name  localhost su.su;
  4.     ssl                  on;
  5.     ssl_certificate      cert/su-cert.pem;
  6.     ssl_certificate_key  cert/su-key.pem;
  7.     ssl_client_certificate cert/ca-cert.pem;
  8.     ssl_session_timeout  5m;
  9.     ssl_verify_client on;
  10.     ssl_protocols  SSLv2 SSLv3 TLSv1;
  11.     ssl_ciphers  RC4:HIGH:!aNULL:!MD5;
  12.     ssl_prefer_server_ciphers   on;
  13.     location / {
  14.         root   html;
  15.         index  index.html index.htm;
  16.     }
  17. }

我没有使用 ssl-sesion-cache 是因为遇到了错误…

15、配置浏览器证书

浏览器首先需要信任自签名的 CA 证书,这样他就可以直接信任服务端提供的证书了,为了双向认证成功,浏览器还需要提供一个传送给服务端的证书,也就是上面制作的客户端证书,对于 IE 来讲,首先在 Internet Options 里选择 Content 选项卡,然后点击 Certificates,新窗口的 Trusted Root Certification Authorities 选项卡选择导入,选择制作好的 ca.cer;其次在 Personal 选项卡选择导入 qiyi.p12,当然,这里导入的时候还需要输入密码-.-

16、测试成果

当将一切都设置好,将 nginx 启动成功后,就可以打开 IE 来访问了,第一次访问,浏览器会询问双向认证时使用的证书,类似下图

sublime-crack-1

选择客户端证书

顺利打开,浏览器没有红色的警告提示,正常显示页面内容就大功告成了。



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [nginx https 认证] 推荐:

nginx 配置 https 的双向认证

- - 操作系统 - ITeye博客
SSL 的双向认证就是,客户端要获取服务端的证书,检查下服务端是不是我可以信任的主机,否则我就认为那个站点的内容不可信任,不应该去访问你(浏览器会告诉你),同时服务端也要检查客户端的证书,客户端如果不是服务端所信任的,那服务端也会认为,你不是我的合法用户,我拒绝给你提供服务. 所以,要让 HTTPS 的双向认证顺利完成,就要在服务端给定一个证书,这个证书是浏览器可信任的,同时客户端(浏览器)也要发送给服务端一个证书,服务器端也要信任这个证书.

Nginx 安装 HTTPS 证书

- - idea's blog
基本步骤可以参考 这篇文章, 但这篇文章有一个致命错误, 就是没有安装 INTERMEDIATE CA, 照样会被浏览器显示证书不可信.. 生成 server.key.orig. 生成 server.csr 和 server.key. 拿着 server.csr 去证书厂商买证书. 买完后, 厂商会给你发两个证书 server.crt 和 server.intermediate.crt.

https单向/双向认证及tomcat配置https方法

- - 行业应用 - ITeye博客
https单向/双向认证及tomcat配置https方法. 1.单向认证,就是传输的数据加密过了,但是不会校验客户端的来源. 2.双向认证,如果客户端浏览器没有导入客户端证书,是访问不了web系统的,找不到地址. 如果想要用系统的人没有证书就访问不了系统的话,就采用双向. 使用keytool为Tomcat生成证书,假定目标机器的域名是“localhost”,keystore文件存放在“C:\OctopusStoreKey\SP2014.keystore”,口令为“123456”,使用如下命令生成:.

使用 Lua 编写一个 Nginx 认证模块

- - 开源软件 - ITeye博客
我考虑了几种解决方案,罗列如下:. 用一个简单的Python/Flask模块来做代理和验证. 一个使用subrequests做验证的nginx模块(nginx目前可以做到这一点). 使用Lua编写一个nginxren认证模块. 很显然,给整个系统添加额外请求将执行的不是很好,因为这将会增加延迟(特别是给每一个页面文件都增加一个请求是很让人烦恼的).这就意味着我们把 subrequest模块排除在外了.

https协议

- - 互联网 - ITeye博客
SSL 协议的握手过程   .       为了便于更好的认识和理解 SSL 协议,这里着重介绍 SSL 协议的握手协议. SSL 协议既用到了公钥加密技术(非对称加密)又用到了对称加密技术,SSL对传输内容的加密是采用的对称加密,然后对对称加密的密钥使用公钥进行非对称加密. 这样做的好处是,对称加密技术比公钥加密技术的速度快,可用来加密较大的传输内容,公钥加密技术相对较慢,提供了更好的身份认证技术,可用来加密对称加密过程使用的密钥.

Go和HTTPS

- - Tony Bai
近期在构思一个产品,考虑到安全性的原因,可能需要使用到 HTTPS协议以及双向数字证书校验. 之前只是粗浅接触过HTTP( 使用Golang开 发微信系列). 对HTTPS的了解则始于那次 自行搭建ngrok服务,在那个过程中照猫画虎地为服务端生成了一些私钥和证书,虽然结果是好 的:ngrok服务成功搭建起来了,但对HTTPS、数字证书等的基本原理并未求甚解.

图文:CentOS 下对 Nginx + Tomcat 配置 SSL 实现服务器 / 客户端双向认证

- - CSDN博客推荐文章
1.1 nginx 包及其依赖包下载. 出于模块的依赖性,Nginx 依赖以下三个包:. gzip 模块需要 zlib 库( http://www.zlib.net/);. rewrite 模块需要 pcre 库( http://www.pcre.org/);. ssl 功能需要 openssl 库( http://www.openssl.org/);.

Google https被屏蔽

- - 月光博客
  根据Google透明度报告 显示,从上周(5月27日)开始,Google的部分服务开始被屏蔽,其中最主要的是HTTPS搜索服务和Google登录服务,所有版本的Google都受到影响,包括Google.hk和Google.com等.   此次屏蔽的方法主要屏蔽Google部分IP地址的443端口,包括google.com.hk,accounts.google.com的部分IP的443端口被封,导致部分中国用户无法访问Google搜索和Gmail,由于Google的IP地址非常多,而被屏蔽的只是其中部分IP,因此只有部分用户受到了影响.

HTTPS的二三事

- - 细语呢喃
前几篇博文都是有关HTTPS的东西,有人可能会问,什么是HTTPS. 因此,本文主要来解答这些疑惑. Alice和Bob是情人,他们每周都要写信. Alice 写好后,送到邮局,邮局通过若干个快递员到Bob,Bob回信过程类似. 这是可以看成的简单的http的传输. 有一天,Alice觉得,要是写的信中途被人拆开了呢.

nginx配置ssl

- - 邢红瑞的blog
先生成网关证书 ,仿照CA模式.