制作Apache免费自签名SSL证书,配置Apache反向代理开启后端服务器https证书验证

概述

通过openssl命令制作自签名证书,配置源服务器服务器自签名证书,配置Apache反向代理服务器开启后端服务器https证书验证。

在另一篇关于配置Apache反向代理的文章中,介绍了通过https + IP + 端口转发到源服务器,当时是通过关闭后端服务器https证书验证实现的,这样不安全也不规范。本文就来介绍如果通过Apache openssl命令制作自签名证书,配置源服务器服务器自签名证书,配置Apache反向代理服务器开启后端服务器https证书验证。

使用openssl命令制作自签名证书

查找openssl命令

Linux 使用命令 find / -name openssl 查找 openssl 命令位置,如果Linux系统自身安装了,会找到 /usr/bin/openssl,我们可以直接使用openssl命令;若系统没有装openssl,但是Apache安装了openssl模块,可以找到 /opt/lampp/bin/openssl,我们可以使用apache的openssl生成证书。

Windows 安装Apache的,可在Apache/bin目录下找到openssl.exe,也是可以使用openssl生成证书的。

生成CA根证书 + 服务端证书(源服务器) + 客户端证书(反向代理服务器)

生成证书的配置文件和bash脚本已打包,可直接下载运行gen.sh。下载解压后执行命令 ./gen.sh 或者 bash gen.sh。对生成证书命令感兴趣的朋友,和windows环境生成证书的,请看本文后半段生成CA根证书 + 服务端证书(源服务器) + 客户端证书(反向代理服务器)的详细介绍和实现方法

生成免费自签名SSL证书 bash脚本

配置apache ssl证书

服务器端(即网站源服务器)配置ssl证书(含根证书)

  1. 修改 httpd-confListen 80 后加上 Listen 8001
  2. 修改 httpd-ssl.conf
<VirtualHost _default_:8001>
    ServerName 115.155.2.10

    #此处省略其他配置,请自己添加

    SSLEngine on
    SSLCertificateFile "/opt/lampp/etc/ssl.crt/server.pem"  #server公钥证书
    SSLCertificateKeyFile "/opt/lampp/etc/ssl.key/server.key"  #server私钥文件

    SSLVerifyClient require  #开启客户端证书验证 
    SSLCACertificateFile "/opt/lampp/etc/ssl.crt/ca.pem"  #根证书,可以验证所有它颁发的客户端证书
</VirtualHost>

代理服务器(即客户端)代理配置

修改 httpd-ssl.conf 添加 SSLProxyCACertificateFile "conf/ssl.crt/root.crt" ,参考设置如下

<VirtualHost _default_:443>
    ServerName www.bluepost.cn
    ServerAlias bluepost.cn

    SSLEngine on
    SSLCertificateFile "conf/ssl.crt/bluepost.cn_public.crt"
    SSLCertificateKeyFile  "conf/ssl.key/bluepost.cn.key"
    SSLCertificateChainFile "conf/ssl.crt/bluepost.cn_chain.crt"

    SSLProxyEngine on
    SSLProxyCACertificateFile "conf/ssl.crt/ca.pem"  #自签名根证书,用于验证所有它颁发的自签名服务端和客户端证书
    SSLProxyMachineCertificateFile "conf/ssl.crt/client_key_crt.pem" #开启客户端证书验证时需要


    #设置代理通过IP和端口
    ProxyPreserveHost on  #打开host域名请求地址,如果使用代理,获取的请求地址是对外域名,如果off关闭,则获取的是内网ip地址请求
    ProxyPass / https://115.155.2.10:8001/  #将IP地址改为国外服务器的IP
    ProxyPassReverse / https://115.155.2.10:8001/
</VirtualHost>

浏览器访问自签名网站

直接用浏览器访问 https://115.155.2.10:8001/ ,会报错 此网站出具的安全证书不是由受信任的证书颁发机构颁发的。 这时我们需要将生成的 ca.pem 证书导入到【受信任的根证书颁发机构】,如果开启了客户端证书验证,还需要将 proxy_client.p12 证书文件导入到 【个人】->【证书】中。

遇到的问题1 – 自签名证书报错ERR_CERT_COMMON_NAME_INVALID

使用自签名的证书后,chrome报错此服务器无法证实它就是 115.155.2.10 它的安全证书没有指定主题备用名称。这可能是因为某项配置有误或某个攻击者拦截了您的连接。
错误码是 NET::ERR_CERT_COMMON_NAME_INVALID:

问题原因

生成证书的时候没有加上备用名称字段,目前的浏览器校验证书都需要这个字段。

解决方法

生成证书的时候需要添加上备用名称(subjectAltName)扩展字段。使用 openssl 生成crt证书时,需要配置 subjectAltName 参数,详细介绍见修改配置文件server-openssl.cnf文件 alt_names

遇到的问题2 – 配置反向代理后,访问网站报错Reason: Error during SSL Handshake with remote server

浏览器直接通过端口访问正常,但是通过域名访问报错如下:

Proxy Error
The proxy server could not handle the request
Reason: Error during SSL Handshake with remote server

Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request.

解决方法

请检查生成源服务器证书时,有没有将域名和IP都加入备用名称(subjectAltName)扩展字段中,修改方法见修改配置文件server-openssl.cnf文件 alt_names

转载请注明:半亩方塘 » 制作Apache免费自签名SSL证书,配置Apache反向代理开启后端服务器https证书验证

页面: 1 2