服务器 Https 证书信息汇总,备忘 证书申请及配置,归集信息
证书是什么
向第三方机构 CA 提交公钥、组织信息、个人信息(域名)等信息并申请认证;
CA 通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等;
如信息审核通过,CA 会向申请者签发认证文件-证书。
证书包含以下信息:
申请者公钥
申请者的组织信息和个人信息
签发机构 CA 的信息
有效时间
证书序列号等信息的明文
同时包含一个签名。
其中签名的产生是这样子的:
使用散列函数对公开的明文信息(公钥和其他信息)进行计算得到信息摘要
采用 CA 的私钥对信息摘要进行加密得到密文,这个密文就是签名
Https 是什么 流程描述
客户端向服务端发送一个招呼报文(hello),包含自己支持的 SSL 版本,加密算法等信息。
服务端回复一个招呼报文(hi)包含自己支持的 SSL 版本,加密算法等信息。
服务端发送自己经过 CA 认证的公开密钥
服务端发送结束招呼的报文,SSL 第一次握手结束。
客户端使用 FPkey 对自己的随机密码串(Ckey)进行加密并发送给服务端
客户端首先使用 CA 的公开密钥对 FPkey 的签名进行认证,确认密钥未被替换
客户端发送提示报文,后续报文将用 Ckey 进行加密。
客户端发送 finished 报文,表示该次发送结束
后续是否通信取决于客户端的 finished 报文能否被服务端成功解密
服务端发送提示报文,表示他之后的报文也会用 Ckey 进行加密
服务端发送 finished 报文。至此 SSL 握手结束,成功建立 SSL 连接。
客户端开始发送 http 请求报文
建立 Tcp 连接,开始传输数据
服务端发送 http 回复报文
另一种流程描述,本质一样
客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器;
服务器从算法列表中选择一种加密算法,并将它和一份包含服务器公用密钥的证书发送给客户端;该证书还包含了用于认证目的的服务器标识,服务器同时还提供了一个用作产生密钥的随机数;
客户端对服务器的证书进行验证(有关验证证书,可以参考数字签名),并抽取服务器的公用密钥;然后,再产生一个称作 pre_master_secret 的随机密码串,并使用服务器的公用密钥对其进行加密(参考非对称加 / 解密),并将加密后的信息发送给服务器;
客户端与服务器端根据 pre_master_secret 以及客户端与服务器的随机数值独立计算出 session key。
客户端将所有握手消息的 MAC 值发送给服务器 ,并使用 session key 加密;
服务器将所有握手消息的 MAC 值发送给客户端 ,并使用 session key 加密。
参考
HTTPS 证书申请流程
选择合适的 CA 机构
生成 CSR 文件(证书签名请求),一般可在线,也可使用 openssl 生成
选择证书类型(DV/OV/EV),不同级别对应的验证方式不同,信息丰富度不同,价格也不同
提交 CSR 到 CA 机构
完成域名验证(DNS/HTTP/email 验证),任一模式验证通过后,CA 机构会签发证书
下载证书文件(通常包含.crt 和.key 文件)
使用证书 nginx 在nginx.conf中添加配置
ssl_certificate "/etc/nginx/cert.crt"; ssl_certificate_key "/etc/nginx/cert.key"; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
完整版本 {F632504}
# For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; # Settings for a TLS enabled server. server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name demo.com; server_tokens off; root /usr/share/nginx/html; ssl_certificate "/etc/nginx/cert.crt"; ssl_certificate_key "/etc/nginx/cert.key"; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; include /etc/nginx/agent_deny.conf; include /etc/nginx/not_self_deny.conf; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { limit_except GET POST { deny all; } } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } }
以下配置已过时
server { listen 80; listen 443 default ssl; ssl_certificate cert.pem; ssl_certificate_key cert.key; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on;
在nginx中,必须使用无密码的密钥文件,否则 Linux
下启动 nginx
会报错[alert] 6584#7060: the event "ngx_master_6584" was not signaled for 5s
,Windows
下会要求输入密钥文件密码才能启动
解决方法
# 将证书密钥文件替换为无密码密钥文件 openssl rsa -in cert.key -out cert.key.unsecure # 将证书含密码密钥改名 mv cert.key cert.key.withpwd # 将不含密码文件命名为cert.key mv cert.key.unsecure cert.key
IHS/Apache 启用mod_ibm_ssl
LoadModule ibm_ssl_module modules/mod_ibm_ssl.so
添加配置
<IfModule mod_ibm_ssl.c> Listen 0.0.0.0:443 <VirtualHost *:443> SSLEnable </VirtualHost> </IfModule> SSLDisable KeyFile "C:\Program Files\IBM\SSLKeyDB\key.kdb"