HTTPS 是在 HTTPS 基础之上添加 SSL/TLS 使网络通讯加密,进而确保通信安全。可简记为 HTTPS = HTTP + SSL/TLS

本文档主要讲解常规SSL格式、Nginx 与 Tomcat 的 SSL 配置方法 及 通过 OpenSSL 转换证书格式的内容。

1. SSL 证书主流格式说明

SSL 及 TLS(新版SSL)统称 SSL 证书(又称 CA 证书、数字证书),用于数据传输过程的加密。

本质上 SSL 证书是一个 X.509 证书,是定义证书数据结构的标准。在 X.509 标准下,包含 Base64 ASCII 文本与二进制两种文件储存方式,根据使用的格式和编码,证书文件具有不同的扩展名。

下图展示了 X.509 主流证书的编码格式和文件扩展名。

对于 Nginx 和 Tomcat 最常使用的是 PEM (Nginx) 与 PKCS#12(Tomcat),除此之外 Tomcat还支持基于JDK keytool 加密的 JKS 格式。

PEM 格式

大多数 CA (证书颁发机构) 提供 PEM 格式的证书,保存在 Base64 ASCII 编码的文件中。证书文件类型可以是 .pem.crt.cer.key。因为是文本类型,所以对文件后缀名不敏感。PEM 文件可以在单个文件中包含服务器证书、中间证书和私钥。服务器证书和中间证书也可以放在单独的 .crt.cer 文件中,私钥可以放在 .key 文件中。

PEM 文件使用 ASCII 编码,可以使用文本编辑器打开,文本内容中公钥、私钥都有两种形式,CSR就一种。X.509 规定,取 ---- 开头的下一行首开始,到下一个 ---- 的上一行尾结束。

  1. ----BEGIN CERTIFICATE----
  2. 公钥加密串
  3. ----END CERTIFICATE----
  4. -----BEGIN PUBLIC KEY-----
  5. 公钥加密串
  6. -----END PUBLIC KEY-----
  7. ---- BEGIN RSA PRIVATE KEY-----
  8. 私钥加密串
  9. -----END RSA PRIVATE KEY-----
  10. -----BEGIN PRIVATE KEY-----
  11. 私钥加密串
  12. -----END PRIVATE KEY-----
  13. -----BEGIN CERTIFICATE REQUEST-----
  14. CSR加密串
  15. -----END CERTIFICATE REQUEST-----

PKCS#7 格式

PKCS#7 格式是一种“加密消息语法标准”。PKCS#7证书使用 Base64 ASCII 编码,文件扩展名为 .p7b.p7c,这种格式只能存储证书,不能存储私钥。一般主要用来做数字信封。格式如下:

  1. -----BEGIN PKCS7-----
  2. 公钥加密串
  3. -----END PKCS7-----

DER 格式

DER 证书采用二进制格式,只含有证书信息,不包含私钥。文件扩展名为 .der.cer。这些证书主要用于Java Web服务器。

PKCS12 格式

PKCS#12证书采用二进制格式,文件扩展名为 .pfx.p12,支持将 服务器证书中间证书私钥 存储在一个具有密码保护的文件中,主要用于Windows平台。

2. Nginx SSL证书配置

Nginx 支持所有 PEM 格式的证书,包含 .pem.crt.cer.key,其中 .key 常用于私钥后缀名。

  1. server {
  2. listen 443 ssl;
  3. server_name www.example.com;
  4. ssl_certificate /path/to/path/public.pem;
  5. ssl_certificate_key /path/to/path/private.key;
  6. ssl_session_timeout 5m;
  7. ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  8. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  9. ssl_prefer_server_ciphers on;
  10. location / {
  11. root html;
  12. index index.html index.htm;
  13. }
  14. }

参数说明:

  • server_name :域名(不含https://)
  • ssl_certificate :【必填】 公钥文件位置
  • ssl_certificate_key :【必填】 私钥文件位置
  • ssl_session_timeout :客户端可复用会话的时间
  • ssl_ciphers:指定启用的加密器类型,必须是OpenSSL库支持的类型,默认 ssl_ciphers HIGH:!aNULL:!MD5;
  • ssl_protocols:表示使用的TLS协议的类型,默认是TLSv1 TLSv1.1 TLSv1.2,可选参数为SSLv2、SSLv3、TLSv1、TLSv1.1、TLSv1.2、TLSv1.3
  • ssl_prefer_server_ciphers:指定服务端加密器优先,参数为on开启,默认off关闭;

官方文档参考

3. Tomcat SSL证书配置

Tomcat 支持 JKS、PKCS11 和 PKCS12 格式的密钥库,JKS 格式是 Java 的标准格式,由 JDK 的 keytool 生成;PKCS11/12 是网络标准,由 OpenSSL 生成。

对于证书格式转换,JKS 一般是由 PKCS12 转换而来,Tomcat 又支持 PKCS12 所以只要将 PEM 格式转换成 PKCS12 (.pfx 或 .p12) 即可。参考 [#PEM 格式 转 PKCS#12](#PEM 格式 转 PKCS#12)

server.xml 配置

  1. <Connector
  2. protocol="org.apache.coyote.http11.Http11NioProtocol"
  3. port="8443" maxThreads="200"
  4. scheme="https" secure="true" SSLEnabled="true"
  5. keystoreFile="<keystoreFile>" keystorePass="<passvalue>"
  6. clientAuth="false" sslProtocol="TLS"/>

参数说明:

  • port :HTTPS 协议端口,可以设置为 443
  • protocol :连接协议,由 HTTP/1.1 改为 org.apache.coyote.http11.Http11NioProtocol
  • keystoreFile :证书文件绝对路径,可以是 JKS 或 PKCS12
  • keystorePass :证书的密码
  • 未说明的参数除 maxThreads 根据实际情况调整,其余均按照上面的配置即可。

官方文档参考:https://tomcat.apache.org/tomcat-8.5-doc/ssl-howto.html#Configuration

4. 主流证书转换方法

一般来说,阿里云、腾讯云直接提供不同服务器类型的证书,以下证书转换仅当无备选类型时使用。

PEM 格式 转 PKCS#12

PEM 格式的公私钥后缀名不影响转换,可以是 .crt /.pem/ .key /.cer

  1. openssl pkcs12 -export -in public.pem -inkey private.key -out keystore.p12 -passout pass:<passvalue>

参数说明

  • -in : 指定PEM 公钥文件
  • -inkey:指定 PEM 私钥文件
  • -out:指定输出 PKCS#12 格式的证书,常以 .p12.pfx 扩展名。
  • -passout:指定 PKCS#12 证书的密码

PKCS#12 转 PEM

当提供PKCS#12证书,则需要转换为PEM证书,命令如下:

  1. #导出私钥
  2. openssl pkcs12 -in keystore.p12 -out private.key -nocerts -nodes -password pass:<passvalue>
  3. #导出公钥
  4. openssl pkcs12 -in keystore.p12 -out public.pem -clcerts -nokeys -password pass:<passvalue>

参数说明

  • -in :输入文件,本命令中是 PKCS#12 证书
  • -out:输出文件,根据上边两种搭配,分别输出私钥与公钥
  • -nocerts:无公钥
  • -nodes:不加密私钥。目前在 OpenSSL 3.0 中废弃,使用 -noenc 代替,Git Bash 自带的版本目前还没升到 3.0
  • -clcerts:只输出客户端证书
  • -nokeys:无私钥
  • -password:PKCS#12证书的密码,需要接 pass:<实际密码>

官方文档参考:https://www.openssl.org/docs/manmaster/man1/openssl-pkcs12.html

5. [扩展] 自签发SSL证书与CA数字证书

自签发 SSL 证书

通过 openssl 生成自签发证书,自签发证书不包含CSR中间证书,直接生成公钥。自签发的证书在网络上是不可信的,但是 内网测试与使用,也是可以的。

命令如下:

  1. #生成RSA私钥
  2. openssl genrsa -out private.key 2048
  3. #自签发公钥
  4. openssl req -new -x509 -key private.key -out public.pem -days 1095 #3年有效期

CA 数字证书

CA 数字证书是由创建者提供 CSR(Centificate Sign Request)给CA机构签发下来的公钥。

一般来讲,SSL运营商(如阿里云等)已经提供了直接下载指定服务器类型的公私钥功能,以下仅是过程简单描述。

CA 机构的处理方式一般不需要创建者关心,命令:

  1. #生成RSA私钥
  2. openssl genrsa -out private.key 2048
  3. #使用私钥生成CSR
  4. openssl req -new -key privkey.key -out cert.csr

将此CSR交给 CA机构 ,由CA签名后获得公钥,使用公钥和私钥就可以部署 HTTPS 服务了。

写文过程难免有错漏,如有指正感激不尽!

SSL基础知识及Nginx/Tomcat配置SSL的更多相关文章

  1. 学习nginx从入门到实践(四) 基础知识之nginx基本配置语法

    nginx基本配置语法 1.http相关 展示每次请求的请求头: curl -v http://www.baidu.com 2.nginx日志类型 error.log. access.log log_ ...

  2. Nginx和Tomcat配置SSL实现https访问

    环境:CentOS 7 Nginx版本: nginx/1.18.0 1. 安装nginx 详细步骤可以参考如下官网:http://nginx.org/en/linux_packages.html#RH ...

  3. 华为云服务器为Tomcat配置SSL

    近期由于开发小程序需要在云服务器上配置https访问协议,也遇到了一点小问题,把配置过程记录一下:SSL 证书申请下来之后会有 .jks .crt .pfx .pem为后缀的文件(如何申请SSL证书这 ...

  4. TOMCAT配置SSL认证为HTTPS协议服务

     1 . 问题概述 很多安全性要求较高的系统,都会使用安全套接字层(SSL)进行信息交换, Sun为了解决在Internet上的实现安全信息传输的解决方案.它实现了SSL和TSL(传输层安全)协议 ...

  5. 单点登录 SSO, 自动登录 , java 加密,ssl原理, Tomcat配置SSL

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 单点登录的英文简称为SSO(single sign on),单点登录功能使得用户只要登录 ...

  6. Tomcat配置SSL

    Tomcat配置SSL 查询网上资料配置如下: <Connector port="8443" protocol="HTTP/1.1" maxThreads ...

  7. 图文解说:Nginx+tomcat配置集群负载均衡

    图文解说:Nginx+tomcat配置集群负载均衡 博客分类: appserver nginxTomcatUbuntuLinux网络应用  作者:niumd Blog:http://ari.iteye ...

  8. Ant学习-001-ant 基础知识及windows环境配置

    一.Ant 概要基础知识 Apache Ant 是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发,用以构建应用,或结合其他开源测试工具例如 git.T ...

  9. 简单的 Nginx+Tomcat 配置负载均衡集群

    简单 Nginx+Tomcat 配置负载均衡集群 前期准备 解压两个tomcat,修改端口号 server1:8081 server:8082 同时启动 nginx官网下载解压版nginx 创建一个简 ...

随机推荐

  1. loadrunner 利用JDBC操作mysql数据库

    import lrapi.lr;import java.util.ArrayList;import java.util.List; import java.sql.Connection; import ...

  2. 关于C语言中对数字的扩展和缩短

    关于对数字的扩展:如果需要在不改变他的类型的情况下去扩展一个数字 有符号数字: 如果最高位为0---向左按位复制0 如果最高位为1---向左按位复制1 无符号数字:向左按位复制0即可 对于数字的缩短: ...

  3. vue日记之可展开的消息气泡

    项目小需求之聊天气泡可展开内容 因为某些信息内容太长或者某种原因必须分行输出,这就导致了有时候一个气泡占据了一整个聊天区域 所以我打算实现一个在该气泡加载的时候判断其气泡长度,并在长度过长的情况下进行 ...

  4. 建立安全SSL连接PostgreSQL数据库服务器

    建立安全SSL连接PostgreSQL数据库服务器当前物联网的挑战之一就是提供最高的安全级别.这就是为什么需要开启SSL连接到 PostgreSQL. 当你想要安全的存储数据到PostgreSQL数据 ...

  5. 手脱UPX壳的方法

    0X00    了解 upx UPX作为一款元老级PE加密壳,在以前的那个年代盛行,著名病毒[熊猫烧香]就是使用这款加密壳. 0X01    单步跟踪法 就是使用ollydbg加载程序后,按F8进行单 ...

  6. netty系列之:使用POJO替代buf

    目录 简介 decode和encode 对象序列化 使用编码和解码器 总结 简介 在之前的文章中我们提到了,对于NioSocketChannel来说,它不接收最基本的string消息,只接收ByteB ...

  7. 用 getchar putchar 来输入和接收 但是要清空缓冲区

    1 //用 getchar putchar 来输入和接收 但是要清空缓冲区 2 3 #include <stdio.h> 4 int main() 5 { 6 char ch1,ch2; ...

  8. 寻找写代码感觉(一)之使用 Spring Boot 快速搭建项目

    写在前面 现在已经是八月份了,我已经荒废了半年居多,不得不说谈恋爱确实是个麻烦的事,谈好了皆大欢喜,分手了就是萎靡不振,需要很长一段时间才能缓过来. 人还是要有梦想的,至于实现只不过是一个契机,但凡不 ...

  9. docker-03

    Docker构建私有registry(仓库) #1 启动registry [root@docker ~]# docker run -d -p 5000:5000 --restart=always -- ...

  10. sqli-labs lesson 38-45

    从page3也就是less 38开始进入了堆叠注入(stacked injection) stacked injection: 简单来说就是进行SQL注入时注入了多条语句.因为之前我们都是只进行过注入 ...