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

在白话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导入到收信任的根证书颁发机构列表中。

注意,收信任的根证书颁发机构列表是操作系统级的,不管通过哪个浏览器进入配置,都是只需要配置一次,再使用其它浏览器时,无需重复配置。
Spring Boot
Spring Boot为web容器提供了统一的抽象配置,不管你使用的是Tomcat是Jetty还是其它web容器,如果要在Spring Boot中使用Https,你只需要在你的配置类中,添加如下代码,注册一个EmbeddedServletContainerCustomizer Bean即可。
需要用到上面生成的Server.jks文件。
@Configuration
public class WebConfig {
@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一样,本文仍然没有介绍服务端怎么验证客户端,但如果你弄懂了原理,我想你已经可以自己去实现了。
自制Https证书并在Spring Boot和Nginx中使用的更多相关文章
- 自制Https证书并在Spring Boot和Nginx中使用(转)
白话Https一文中, 介绍了Https存在的目的和工作原理,但多是偏向于原理性的介绍,本文介绍如何一步一步自制一个能够通过浏览器认证的Https证书,并讲解在Spring Boot环境和Nginx环 ...
- spring boot 学习(六)spring boot 各版本中使用 log4j2 记录日志
spring boot 各版本中使用 log4j2 记录日志 前言 Spring Boot中默认日志工具是 logback,只不过我不太喜欢 logback.为了更好支持 spring boot 框架 ...
- Spring Boot源码中模块详解
Spring Boot源码中模块详解 一.源码 spring boot2.1版本源码地址:https://github.com/spring-projects/spring-boot/tree/2.1 ...
- Spring Boot 利用 nginx 实现生产环境的伪热更新
当我们在服务器部署Java程序,特别是使用了 Spring Boot 生成单一 Jar 文件部署的时候,单一文件为我们开发单来的极大的便利性,保障程序的完整性.但同时对我们修改程序中的任何一处都带来重 ...
- Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题【转】
Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题 http://blog.didispace.com/Spring-Boot-And-Feign- ...
- 阿里P7级教你如何在Spring Boot应用程序中使用Redis
在Spring Boot应用程序中使用Redis缓存的步骤: 1.要获得Redis连接,我们可以使用Lettuce或Jedis客户端库,Spring Boot 2.0启动程序spring-boot-s ...
- Spring Boot 计划任务中的一个“坑”
计划任务功能在应用程序及其常见,使用Spring Boot的@Scheduled 注解可以很方便的定义一个计划任务.然而在实际开发过程当中还应该注意它的计划任务默认是放在容量为1个线程的线程池中执行, ...
- IDEA问题之“微服务启动项目时,不会加载Spring Boot到Services中”
1.启动项目时,不会加载Spring Boot到Services中 现象解析: 启动项目时 会在debug的位置加载项目 注:这里没有配图,因为问题已解决,未记录图,需往后遇到记录 解决方案: 需要在 ...
- Asynchronous Streaming Request Processing in Spring MVC 4.2 + Spring Boot(SpringBoot中处理异步流请求 SpringMvc4.2以上)
With the release of Spring 4.2 version, Three new classes have been introduced to handle Requests As ...
随机推荐
- SSH三大框架笔面试总结
Java工程师(程序员)面题 Struts,Spring,Hibernate三大框架 1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建Sess ...
- .Net MVC中的路由
MVC中的URL也就是路由,不用通过路径访问实际的物理文件而达到向用户展示界面. URL的路由功能 一方面正向 映射到Controller和Action,根据用户输入的URL触发相应的控制器和对应方法 ...
- iOS集成丁香园DXY OAuth 登陆 swift代码示例
问:iOS集成OAuth登陆分几步? 答:和把大象放冰箱里一样. 第一步:打开webview,跳转到登陆页面: let url = "https://auth.dxy.cn/conn/oau ...
- VS2012 编译带有c/c++代码的python模块失败解决方案
python2.7默认编译带有/c++代码的模块/包是使用VS2008环境变量,所以为了可用,我们要在编译前设置环境变量 SET VS90COMNTOOLS=%VS110COMNTOOLS% 但有时只 ...
- JDBC数据类型
JDBC数据类型 JDBC驱动程序Java数据类型转换到适当的JDBC类型然后再将它发送到数据库.它使用默认的大多数数据类型映射.例如,一个Java int转换成一个SQL INTEGER.创建默认映 ...
- Xamarin开发Android笔记:拍照或相册选取图片角度问题
在开发Android应用的时候,可能会遇到类似微信朋友圈中拍照或相册选取图片的场景,拍照或选取图片之后在显示的时候却发现图片的角度不对,明明是竖版拍照,显示出来缺失躺着的. 这是因为在某些特定手机上例 ...
- 做NavMesh相关工作时收集的一些文章
三角形拾取 http://www.blackpawn.com/texts/pointinpoly/default.htmlCS NavMesh使用手册https://developer.valveso ...
- 用DirectX实现魔方(一)
关于魔方 魔方英文名字叫做Rubik's Cube,是由匈牙利建筑学教授和雕塑家Ernő Rubik于1974年发明,最初叫做Magic Cube(这大概也是中文名字的来历吧),1980年Ideal ...
- [Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手"
[Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手" 我在学Unity3D,TankSniper(坦克狙击手)这个项目是用来练手的.游戏玩法来自这里(http://ww ...
- 使用SqlBulkCopy类来批量复制数据
DataTable dt = new DataTable(); dt.Columns.Add("id", typeof(string)); ; i < ; i++) { Da ...