如何通过 SSL 连接到需要通过 Apache 代理进行证书交换的服务器?

如何通过 SSL 连接到需要通过 Apache 代理进行证书交换的服务器?

我需要通过 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 常见问题解答

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 指令

目前不支持加密私钥

相关内容