设为首页 收藏本站
查看: 1052|回复: 0

[经验分享] 自制Https证书并在Spring Boot和Nginx中使用

[复制链接]

尚未签到

发表于 2017-3-1 08:10:38 | 显示全部楼层 |阅读模式
  白话Https一文中, 介绍了Https存在的目的和工作原理,但多是偏向于原理性的介绍,本文介绍如何一步一步自制一个能够通过浏览器认证的Https证书,并讲解在Spring Boot环境和Nginx环境中服务器端的配置。
  如果你还没有读过白话Https,我强烈建议你先去读一下。按照白话Https中的介绍,Https协议涉及到的主体主要有三个:客户端、服务端、以及CA机构。如下图所示:
DSC0000.png

  在白话Https一文中,曾介绍一个服务要申请使用Https的流程。本文所介绍的流程,针对自制Https证书,更多的面向测试场景,当然了,有些网站,比如像12306这样的,也会自制根证书要求用户安装。既然是要DIY,当然也要分别在三个主体上做工作。

证书颁发机构


  • CA机构私钥
  

openssl genrsa -out ca.key 2048  


  • CA证书
  

openssl req -x509 -new -key ca.key -out ca.crt  

  注意生成过程中需要输入一些CA机构的信息

服务端


  • 生成服务端私钥
  

openssl genrsa -out server.key 2048  


  • 生成服务端证书请求文件
  

openssl req -new -key server.key -out server.csr  

  注意生成过程中需要你输入一些服务端信息


  • 使用CA证书生成服务端证书
  

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

  关于sha256,默认使用的是sha1,在新版本的chrome中会被认为是不安全的,因为使用了过时的加密算法。


  • 打包服务端的资料为pkcs12格式(非必要,只是换一种格式存储上一步生成的证书)
  

openssl pkcs12 -export -in server.crt -inkey server.key -out server.pkcs12  

  生成过程中,需要创建访问密码,请记录下来。


  • 生成服务端的keystore(.jks文件, 非必要,Java程序通常使用该格式的证书)
  

keytool -importkeystore -srckeystore server.pkcs12 -destkeystore server.jks -srcstoretype pkcs12  

  生成过程中,需要创建访问密码,请记录下来。


  • 把ca证书放到keystore中(非必要)
  

keytool -importcert -keystore server.jks -file ca.crt  

客户端


  • 导入根证书ca.crt到浏览器受信任的根证书颁发机构列表中
  不管通过什么浏览器吧,总之你要找到下面这个页面,点击导入,将上面生成的CA机构的ca.crt导入到收信任的根证书颁发机构列表中。
DSC0001.png

  注意,收信任的根证书颁发机构列表是操作系统级的,不管通过哪个浏览器进入配置,都是只需要配置一次,再使用其它浏览器时,无需重复配置。

Spring Boot
  Spring Boot为web容器提供了统一的抽象配置,不管你使用的是Tomcat是Jetty还是其它web容器,如果要在Spring Boot中使用Https,你只需要在你的配置类中,添加如下代码,注册一个EmbeddedServletContainerCustomizer Bean即可。
  需要用到上面生成的Server.jks文件。
@Configuration
  
public>  

  @Bean
  public EmbeddedServletContainerCustomizer containerCustomizer() {
  return new EmbeddedServletContainerCustomizer() {
  @Override
  public void customize(ConfigurableEmbeddedServletContainer container) {
  Ssl ssl = new Ssl();
  ssl.setKeyStore("Server.jks");
  ssl.setKeyStorePassword("passwd");
  container.setSsl(ssl);
  container.setPort(8443);
  }
  };
  }
  
}

Nginx
  如果要在Nginx中使用Https,需要用到上面生成的Server.crt,Server.key。
  

server {  listen      127.0.0.1:443 ssl;
  ssl on;
  ssl_certificate Server.crt;
  ssl_certificate_key Server.key;
  

  #省略无关配置...  
  
}
  

总结


  • crt、jks、pkcs12都是用来保存证书的不同格式,不同的服务器软件可能会使用不同格式的证书文件。
  • OpenSSl、Keytool都是可以用来生成Https证书的工具软件,其中OpenSSl功能更多更复杂,Keytool随JDK安装而安装。
  • 证书的格式是多样的,生成证书的软件工具有很多,不同服务器程序的配置方法不尽相同,要达成目的有很多种方法。所以,重要的是弄懂原理,而不是按照教程一步一步敲命令。
  • 跟白话Https一样,本文仍然没有介绍服务端怎么验证客户端,但如果你弄懂了原理,我想你已经可以自己去实现了。  



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-348536-1-1.html 上篇帖子: 消息队列入门(四)ActiveMQ的应用实例 下篇帖子: 彻底解决 intellij IDEA 卡顿 优化笔记
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表