什么是 https 协议?
http 协议以明文的方式在网络中传输, 安全性难以保证, https 在 http 协议的基础上加入 SSL/TLS 层. TLS 是 SSL 协议的最新版本, SSL 使用 SSL 数字证书在通信两端建立加密链路, 对两端通信数据进行加密, 从而保证通信数据安全.
http 和 https 协议比较如下:
SSL 协议工作原理
SSL 协议主要涉及非对称加密和对称加密技术.
非对称加密, 使用一对密钥加解密数据, 公钥 (public key) 对外公开, 私钥自己保留(private key). 使用私钥加密的数据只有对应的公钥才能解密. SSL 使用非对称加密进行通信初始化(SSL handshake), 非对称加密算法包括 RSA,,DSA,PKCS 等.
对称加密, 加解密都用同一个 key.SSL 在通信初始化 (handshake) 后, 用 session key 进行对称加密通信. 对称加密算法包括 AES-128, AES-192 and AES-256.
SSL 协议通信包括两个阶段: SSL handshake 和数据传输. SSL handshake 阶段使用非对称加密, 数据传输阶段使用对称加密.
SSL handshake 包含以下步骤:
1. 客户端发送 "client hello" 消息, 这条消息中包含客户端 SSL 版本以及其它服务端需要的信息.
2. 服务端回复 "server hello" 消息, 这条消息包含服务端 SSL 版本, 包含 public key 的 SSL 数字证书及其它信息.
3. 客户端发送请求给 CA(Certificate Authority, 证书颁发机构)对服务端进行身份验证. 验证失败则拒绝建立 SSL 连接, 否则继续 4.
4. 客户端生成 session key, 用服务端的 public key 加密, 并发送给服务端. 假如服务端也要求验证客户端, 客户端也需要发送自己的证书(一般是 server 之间的通信需要).
5. 服务端用自己的 private key 解密出 session key, 并用 session key 加密发送确认消息.
数据传输阶段如下, 用 SSL handshake 阶段生成的 session key 对数据进行对称加密通信. 和非对称加密相比, 对称加密简单, 加解密速度会更快.
SSL 证书
SSL 证书是由 CA 机构颁发的含服务端 public key 及其它信息的数据文件. 比如 google 的数字证书如下, 可以点击详细信息查看更多证书内容.
数字证书由 X.509 标准定义, X.509 使用 Abstract Syntax Notation One (ASN.1)标记去表示数字证书结构. 数字证书一般包含下面这些域.
SSL 证书基于验证级别和认证 domain 数可分为不同类型, 基于验证级别可分为 Domain Validated Certificates(DV, 域名型),Organization Validated Certificates(OV, 企业型),Extended Validated Certificates(EV, 企业增强型). 域名型证书用于验证单个域名, 企业型证书可验证某域名下的所有子域名, 比如 *.killianxu.cn, 企业增强型证书可用于验证不相关的多个相关域名. 基于 domain 数可分为 Single Domain Certificate,Wildcard SSL Certificate 和 Unified SSL Certificate /Multi-Domain SSL Certificate/SAN Certificate.
获取 SSL 证书
SSL 证书可以从 CA 机构购买或者从免费 CA 机构获取. 在申请证书时可能需要提交 Certificate Signing Request (CSR).CSR 是由 openssl 等 SSL tools 工具或服务器生成的 Base64 编码文本. 内含公钥, 域名, 组织, 地址等信息, CA 机构颁发的证书中就包含 CSR 中的公钥信息. CSR 文本由 -----BEGIN NEW CERTIFICATE REQUEST-----"开始, 并由"-----END NEW CERTIFICATE REQUEST----- 结束, CSR 格式如下:
可在线生成 CSR 和 private key 两个文件.
生成 csr 文件后, 可申请免费 DV 类型 SSL 证书.
腾讯云可免费申请域名验证级别的 SSL 证书, 生成证书过程自动生成 CSR.
生成的证书可下载安装到 server.SSL 证书有不同的格式, PEM 和 PKCS#7 使用 Base64 编码, DER 和 PKCS#12 使用二进制编码.
腾讯云申请的证书如下, 其中包含了适用于几种主流服务器的证书格式, 其中 www.killianxu.cn.csr 为自动生成的 CSR 文件.
安装 SSL 证书
每种服务器证书安装方法都不一样, 本文讲解在 tomcat 上的安装. 在安装前若证书格式和服务器支持的证书格式不一样, 需要利用 OpenSSL 转换.
在 tomcat 安装路径下 conf/server.xml 增加如下 SSL/TLS 配置, 支持 https:
- <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
- maxThreads="150" SSLEnabled="true" scheme="https">
- <SSLHostConfig>
- <Certificate certificateKeystoreFile="conf/www.killianxu.cn.jks" certificateKeystorePassword="d62spdpc5se3an"
- certificateKeyAlias="www.killianxu.cn" type="RSA" />
- </SSLHostConfig>
- </Connector>
强制所有的 http 访问重定向到 https, 在 conf/web.xml 的结束标签 Web-App 强增加配置:
- <login-config>
- <!-- Authorization setting for SSL -->
- <auth-method>CLIENT-CERT</auth-method>
- <realm-name>Client Cert Users-only Area</realm-name>
- </login-config>
- <security-constraint>
- <!-- Authorization setting for SSL -->
- <Web-resource-collection>
- <Web-resource-name>SSL</Web-resource-name>
- <url-pattern>/*</url-pattern>
- </Web-resource-collection>
- <user-data-constraint>
- <transport-guarantee>CONFIDENTIAL</transport-guarantee>
- </user-data-constraint>
- </security-constraint>
重启 tomcat
验证证书安装成功
输入: curl -v https://www.killianxu.cn:8443/test.html
可看到 1 部分获取到 SSL 证书信息, 2 部分获取网页数据
输入: curl -v http://www.killianxu.cn:9999/test.html
http 协议收到 302 重定向状态码, 并有 Location 重定向新路径
参考文献
- https://www.tutorialsteacher.com/https
- https://yevon-cn.github.io/2017/04/09/https-config-of-tomcat.html
来源: https://www.cnblogs.com/killianxu/p/11367691.html