nginx 配置 https 的双向认证

标签: nginx https 认证 | 发表时间:2015-01-27 14: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.

nginx强制使用https访问的多种方法(http跳转到https)

- - C1G军火库
nginx强制使用https访问的多种方法(http跳转到https). 先说明一下HTTP跳转的状态码. 301 Moved Permanently:该方式将所有的 HTTP 请求重定向到 HTTPS 上,并且该重定向是永久性的. 客户端在收到 301 响应后,会自动将 HTTP 请求转为 GET 请求,同时将请求地址修改为重定向后的地址.

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

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

基于 Nginx 的 HTTPS 性能优化实践

- - 编程学习网
分享一个HTTPS优化案例(文章稍长. 随着相关浏览器对HTTP协议的“不安全”、红色页面警告等严格措施的出台,以及向 iOS 应用的 ATS 要求和微信、支付宝小程序强制 HTTPS 需求,以及在合规方面如等级保护对传输安全性的要求都在推动 HTTPS 的发展. 虽然 HTTPS 优化了网站访问体验(防劫持)以及让传输更加安全,但是很多网站主赶鸭子上架式的使用了 HTTPS 后往往都会遇到诸如:页面加载速度变慢、服务器负载过高以及证书过期不及时更新等问题.

Nginx + Tomcat + HTTPS 配置原来不需要在 Tomcat 上启用 SSL 支持

- -
之前在网上搜索到的很多文章在描述. Nginx + Tomcat启用 HTTPS 支持的时候,都必须在 Nginx 和 Tomcat 两边同时配置 SSL 支持. 但我一直在想为什么就不能按照下面的方式来配置呢. 就是 Nginx 上启用了 HTTPS,而 Nginx 和 Tomcat 之间走的却是普通的 HTTP 连接.

certbot在Centos7上配置合法签名证书,实现nginx的https访问-咖啡猫Mr-51CTO博客

- -
  公司因之前使用的openssh创建的自签名证书,有一个弊端,就是在某些客户端上不能使用此证书,无法使用https连接,所以,研究了一下certbot 做签名证书. 你需要有一个公网地址,并绑定合法域名. (1)、下载Certbot客户端:. (2)、下载后,进入下载的目录,添加执行权限. 3、介绍一下certbot的两种工作方式:.

如何让网站和API都支持HTTPS?在Nginx上做文章是个好选择!

- - 掘金后端本月最热
SpringBoot实战电商项目mall(40k+star)地址:. 随着我们网站用户的增多,我们会逐渐意识到HTTPS加密的重要性. 在不修改现有代码的情况下,要从HTTP升级到HTTPS,让Nginx支持HTTPS是个很好的选择. 今天我们来讲下如何从Nginx入手,从HTTP升级到HTTPS,同时支持静态网站和SpringBoot应用,希望对大家有所帮助.

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

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

https协议

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