我需要通过 SSL 连接到外部服务器,该服务器仅接受遵循以下架构的证书交换:
客户端(我的 Nodejs 服务器)-----http----->(反向?)代理 ----https-----> 外部服务器请求证书。
我不拥有外部服务器,但他们在他们的系统中安装了我的证书。
我使用 Let's Encrypt 生成证书,因此我有 4 个文件:
privkey.pem --> Private Key
cert.pem --> Public Key
chain.pem --> Certificate Chain
fullchain.pem --> Concatenation of cert.pem and chain.pem
当前,不起作用,apache 2.4.33 vhost 配置:
<VirtualHost *:80>
SSLProxyEngine On
SSLProxyVerify require
SSLCertificateFile path/fullchain.pem
SSLCertificateKeyFile path/privkey.pem
SSLProxyMachineCertificateChainFile path/fullchain.pem
SSLProxyCACertificateFile path/fullchain.pem
# mydomain.certandkey.pem is a concatenation of cert.pem and privkey.pem
SSLProxyMachineCertificateFile mydomain.certandkey.pem
ProxyRequests Off
RewriteEngine On
#ProxyPreserveHost On
#<Proxy *>
#Order deny,allow
#Allow from all
#</Proxy>
ProxyPass / https://external.server.com/
ProxyPassReverse / https://external.server.com/
</VirtualHost>
apache 错误日志是
AH02252: incomplete client cert configured for SSL proxy (missing or encrypted private key?)
[date] [ssl:emerg] [pid 76986] AH02312: Fatal error initialising mod_ssl, exiting.
AH00016: Configuration Failed
它似乎来自SSLProxyMachineCertificateFile
于当我注释相应的行时它就消失了(但连接不起作用)。
有人知道如何解决这个问题或者遇到类似的连接情况吗?
我花了两天时间在互联网上查找并尝试了许多配置,这让我发疯。
非常感谢。
答案1
您正在尝试使用不能用于此目的的证书。
引自SSLProxyMachineCertificateFile 的 Apache 文档
串联 PEM 编码文件客户端证书以及代理使用的密钥
(我突出显示)
Let's Encrypt 是否为网站颁发除 SSL/TLS 之外的其他证书?
Let's Encrypt 证书是标准域验证证书,因此您可以将它们用于任何使用域名的服务器,如 Web 服务器、邮件服务器、FTP 服务器等。
电子邮件加密和代码签名需要 Let's Encrypt 不颁发的不同类型的证书。
客户端身份验证属于电子邮件加密和代码签名类别。需要为此目的创建证书。Let's Encrypt 证书仅供服务器使用。
答案2
从错误信息来看,私钥是加密的。反向代理要使用客户端证书,需要解密私钥。
例子:
openssl rsa -in my.key -out dec.key
Enter pass phrase for my.key:
writing RSA key
SSLProxyMachineCertificateFile 指令
目前不支持加密私钥