配置HTTPS
Apache通过 ssl_module
模块为 HTTP 披上 SSL 的外衣。一般把 HTTPS 的配置放在一个单独的配置文件中,并通过 Include
加载。
SSL 配置放在
<VirtualHost>
片段之外,所有主机能且仅能使用HTTPS
访问;
配置放在<VirtualHost>
片段中,则该虚拟主机既可以使用HTTP
也能使用HTTPS
访问,其他虚拟主机则只能使用HTTP
访问
SSLEngine
描述: SSL引擎操作开关
语法: SSLEngine on|off|optional
默认: SSLEngine off
语境: 系统配置文件, <VirtualHost>
片段
状态: Extension
模块: mod_ssl
在Apache 2.1及更高版本中,SSLEngine可以设置为 optional,使SSL升级到RFC2817中约定的HTTP/1.1的TLS。不过目前(2018-11-27 10:45:56 星期二)很多Web浏览器还不支持RFC2817。
SSLCertificateFile
描述: PEM-encoded X.509编码的服务器证书数据文件
语法: SSLCertificateFile file-path
语境: 系统配置文件, <VirtualHost>
片段
状态: Extension
模块: mod_ssl
该指令指向具有PEM格式的证书数据的文件。该文件至少必须包含一个终端实体(叶)证书。该指令可以多次使用(引用不同的文件名)以支持多种服务器身份验证算法 - 通常是RSA,DSA和ECC。
SSLCertificateFile "xxx/conf/ssl/server.cer"
SSLCertificateKeyFile
描述: PEM-encoded X.509编码的服务器私钥文件
语法: SSLCertificateKeyFile file-path
语境: 系统配置文件, <VirtualHost>
片段
状态: Extension
模块: mod_ssl
该指令指向服务器的PEM编码私钥文件。如果包含的私钥已加密,则在启动时强制使用密码短语对话框。
该指令可以多次使用(引用不同的文件名)以支持多种服务器身份验证算法。对于每个 SSLCertificateKeyFile
指令,必须有匹配的 SSLCertificateFile
指令。
SSLCertificateKeyFile "xxx/conf/ssl/server.key"
SSLSessionCache
描述: 全局/进程间 SSL会话高速缓存的类型
语法: SSLSessionCache type
默认: SSLSessionCache none
语境: 系统配置文件
状态: Extension
模块: mod_ssl
配置全局/进程间SSL会话高速缓存的存储类型。此缓存是一个可选工具,可加速并行请求进程。通过HTTP keep-alive对同一服务器发起的请求,OpenSSL会在本地缓存SSL会话信息。但是因为现代客户端通过并行请求请求内联图像和其他数据,这些请求由不同的服务器进程提供服务,使用进程间缓存有助于避免不必要的会话握手。
目前支持以下五种存储类型:
none
禁用全局/进程间会话高速缓存。这将导致明显的速度损失,并且如果使用某些浏览器可能会导致问题,特别是如果启用了客户端证书。建议不要使用此设置。nonenotnull
禁用任何全局/进程间会话高速缓存。此指令强制openssl发送一个非空会话ID,以适应需要一个会话ID的错误客户机。dbm:/path/to/datafile
利用本地磁盘上的DBM散列文件来同步服务器进程的OpenSSL内存缓存。。这种方式可能在高负载下遭受可靠性问题。需要加载socache_dbm_module
模块。例如:SSLSessionCache "dbm:/usr/local/apache/logs/ssl_gcache_data"
shmcb:/path/to/datafile[(size)]
利用RAM(通过/path/to/datafile建立)中的共享内存段内的高性能循环缓冲区(大小约为”size”字节)来同步服务器进程的OpenSSL内存缓存。这是推荐的会话缓存,需要加载socache_shmcb_module
模块。例如:SSLSessionCache "shmcb:/usr/local/apache/logs/ssl_gcache_data(512000)"
dc:UNIX:/path/to/socket
利用远程分布式会话缓存库。参数应该使用远程地址指定要使用的服务器或代理的位置。需要加载socache_dc_module
模块。例如:UNIX:/path/to/socket #指定UNIX域套接字(通常是本地dc_client代理); IP:server.example.com:9001 #指定IP地址。
SSLSessionCacheTimeout
描述: SSL会话在会话高速缓存中到期之前的秒数
语法: SSLSessionCacheTimeout seconds
默认: SSLSessionCacheTimeout 300
语境: 系统配置文件, <VirtualHost>
片段
状态: Extension
模块: mod_ssl
自签名证书生成
在
Apache
的conf
目录下新建文件夹ssl
,用于存放证书(可选,证书可以放在任意位置,后续配置HTTPS时只要正确指向即可)cmd 进入命令行,进入 apache 安装目录的 bin 目录(如果 bin 目录已加入环境变量,可以省略此步)
设置配置文件位置
set OPENSSL_CONF=../conf/openssl.cnf
生成一个根证书私钥
ca_private.key
openssl genrsa -out ../conf/ssl/ca_private.key 2048
使用根证书私钥生成 csr (根证书的签名请求)
openssl req -new -key ../conf/ssl/ca_private.key -out ../conf/ssl/ca.csr -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=self/OU=self/CN=self"
使用根证书私钥和 csr 生成根证书
openssl x509 -req -days 18250 -sha256 -signkey ../conf/ssl/ca_private.key -in ../conf/ssl/ca.csr -out ../conf/ssl/ca.cer
生成服务端证书私钥
openssl genrsa -out ../conf/ssl/server_private.key 2048
使用服务端证书私钥生成 csr (服务端证书的签名请求)
openssl req -new -key ../conf/ssl/server_private.key -out ../conf/ssl/server.csr -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=personal/OU=personal/CN=blog.com"
在
conf/ssl/
目录下创建扩展文件server.ext
(内含域名等信息,后续生成服务端证书时),文件内容为:subjectAltName = @alt_names
extendedKeyUsage = serverAuth
[alt_names]
# 域名,如有多个用DNS.2,DNS.3…来增加
DNS.1 = blog.com
# IP地址
IP.1 = 192.168.1.102
IP.2 = 127.0.0.1
使用服务端私钥、扩展文件和 csr 生成服务端证书
openssl x509 -req -days 18250 -sha256 -CA ../conf/ssl/ca.cer -CAkey ../conf/ssl/ca_private.key -CAserial ../conf/ssl/ca.srl -CAcreateserial -in ../conf/ssl/server.csr -out ../conf/ssl/server.cer -extfile ../conf/ssl/server.ext
将根证书导入“受信任的根证书颁发机构”。例如 谷歌浏览器->设置->高级->隐私设置和安全性->管理证书
如果没有将根证书导入,或者生成服务端证书时没有使用
-extfile
参数为证书绑定域名,使用https
访问时会提示“您的连接不是私密连接”