在Windows上的Apache 2.4上配置SSL时出错



我有一个windows服务器虚拟机,在公司网络上运行服务器2019,它将用作Apache的web服务器。我在上面安装了apache2.4的副本,它提供的http页面也很好,但我正在尝试为https连接设置SSl。

我已经讨论过使用MMC添加证书管理单元,然后使用它生成请求。(我认为这就是密钥文件?)并将此文件发送给企业中必要的管理员,为我提供证书,以便用户浏览器在通过公司内部网上的https访问网站时显示绿色地址栏。

他们给我寄回了以下文件:

certnew.cer   
certnew.p7b   
intermediate.cer
root.cer

然后我在谷歌上搜索了很多,找到了关于如何使用这些文件的各种信息,我得出了以下结论:(如果错误,请更正)。

  • Cer文件和crt文件是一回事。他们可以有一些内容中的不同编码,但您通常使用.cer文件在同一个地方,你可以使用.crt文件,所以如果Apache说明中提到了一个,我可能会使用另一个只需重命名文件扩展名
  • 我发送的文件是我需要使用的私钥文件在SSL配置中
  • Apache 2.4和更早版本之间发生了一些变化版本,所以我在查看有关SSL的指南时应该小心确保它适用于2.4版本
  • 我需要在主http配置文件中启用SSL,并将证书文件和服务器的详细信息添加到httpd-SSL.conf文件中

该文件的重温部分当前如下所示:


<VirtualHost *:443>

#   General setup for the virtual host
DocumentRoot "${SRVROOT}/htdocs"
ServerName <servername>
ServerAdmin <internal email>
ErrorLog "${SRVROOT}/logs/error.log"
TransferLog "${SRVROOT}/logs/access.log"

#   SSL Engine Switch:
#   Enable/Disable SSL for this virtual host.
SSLEngine on

#   Server Certificate:
#   Point SSLCertificateFile at a PEM encoded certificate.  If
#   the certificate is encrypted, then you will be prompted for a
#   pass phrase.  Note that a kill -HUP will prompt again.  Keep
#   in mind that if you have both an RSA and a DSA certificate you
#   can configure both in parallel (to also allow the use of DSA
#   ciphers, etc.)
#   Some ECC cipher suites (http://www.ietf.org/rfc/rfc4492.txt)
#   require an ECC certificate which can also be configured in
#   parallel.
SSLCertificateFile "${SRVROOT}/conf/primary.crt"
#SSLCertificateFile "${SRVROOT}/conf/server-dsa.crt"
#SSLCertificateFile "${SRVROOT}/conf/server-ecc.crt"

#   Server Private Key:
#   If the key is not combined with the certificate, use this
#   directive to point at the key file.  Keep in mind that if
#   you've both a RSA and a DSA private key you can configure
#   both in parallel (to also allow the use of DSA ciphers, etc.)
#   ECC keys, when in use, can also be configured in parallel
SSLCertificateKeyFile "${SRVROOT}/conf/private.key"
#SSLCertificateKeyFile "${SRVROOT}/conf/server-dsa.key"
#SSLCertificateKeyFile "${SRVROOT}/conf/server-ecc.key"

#   Server Certificate Chain:
#   Point SSLCertificateChainFile at a file containing the
#   concatenation of PEM encoded CA certificates which form the
#   certificate chain for the server certificate. Alternatively
#   the referenced file can be the same as SSLCertificateFile
#   when the CA certificates are directly appended to the server
#   certificate for convenience.
SSLCertificateChainFile "${SRVROOT}/conf/certificate.crt"

#   Certificate Authority (CA):
#   Set the CA certificate verification path where to find CA
#   certificates for client authentication or alternatively one
#   huge file containing all of them (file must be PEM encoded)
#   Note: Inside SSLCACertificatePath you need hash symlinks
#         to point to the certificate files. Use the provided
#         Makefile to update the hash symlinks after changes.
#SSLCACertificatePath "${SRVROOT}/conf/root.cer"
SSLCACertificateFile "${SRVROOT}/conf/root.cer"

所以我取了一份我收到的文件的副本,以及我发送给他们的密钥文件,并如上所述对它们进行了重命名,以便在ssl配置文件中对它们进行重新定义。

当我尝试启动apache服务时,如果在主http文件中启用SSL并出现一般错误,它就会失败。(但当我在主conf文件中注释掉SSL时,仍然可以正常工作。)因此,我尝试从命令提示符启动httpd.exe文件,以获得一些更有帮助的错误。在运行了没有错误响应的文件后,我检查了错误日志,并显示了我最近尝试的以下错误行:

[Sun Oct 30 15:06:02.661255 2022] [ssl:emerg] [pid 3484:tid 512] AH02577: Init: SSLPassPhraseDialog builtin is not supported on Win32 (key file D:/Apache24/conf/private.key)
[Sun Oct 30 15:06:02.661255 2022] [ssl:emerg] [pid 3484:tid 512] AH02311: Fatal error initialising mod_ssl, exiting. See D:/Apache24/logs/error.log for more information
[Sun Oct 30 15:06:02.661255 2022] [ssl:emerg] [pid 3484:tid 512] AH02564: Failed to configure encrypted (?) private key <servername>:443:0, check D:/Apache24/conf/private.key
[Sun Oct 30 15:06:02.661255 2022] [ssl:emerg] [pid 3484:tid 512] SSL Library Error: error:0D0680A8:asn1 encoding routines:asn1_check_tlen:wrong tag
[Sun Oct 30 15:06:02.661255 2022] [ssl:emerg] [pid 3484:tid 512] SSL Library Error: error:0D07803A:asn1 encoding routines:asn1_item_embed_d2i:nested asn1 error (Type=PKCS8_PRIV_KEY_INFO)
[Sun Oct 30 15:06:02.661255 2022] [ssl:emerg] [pid 3484:tid 512] SSL Library Error: error:0D0680A8:asn1 encoding routines:asn1_check_tlen:wrong tag
[Sun Oct 30 15:06:02.661255 2022] [ssl:emerg] [pid 3484:tid 512] SSL Library Error: error:0D08303A:asn1 encoding routines:asn1_template_noexp_d2i:nested asn1 error
[Sun Oct 30 15:06:02.661255 2022] [ssl:emerg] [pid 3484:tid 512] SSL Library Error: error:0D0680A8:asn1 encoding routines:asn1_check_tlen:wrong tag
[Sun Oct 30 15:06:02.661255 2022] [ssl:emerg] [pid 3484:tid 512] SSL Library Error: error:0D07803A:asn1 encoding routines:asn1_item_embed_d2i:nested asn1 error (Type=RSAPrivateKey)
[Sun Oct 30 15:06:02.661255 2022] [ssl:emerg] [pid 3484:tid 512] SSL Library Error: error:04093004:rsa routines:old_rsa_priv_decode:RSA lib
[Sun Oct 30 15:06:02.661255 2022] [ssl:emerg] [pid 3484:tid 512] SSL Library Error: error:0D0680A8:asn1 encoding routines:asn1_check_tlen:wrong tag
[Sun Oct 30 15:06:02.661255 2022] [ssl:emerg] [pid 3484:tid 512] SSL Library Error: error:0D07803A:asn1 encoding routines:asn1_item_embed_d2i:nested asn1 error (Type=PKCS8_PRIV_KEY_INFO)
AH00016: Configuration Failed

我真的不知道这意味着什么,但我猜它告诉我我的私钥文件有问题,但我不知道如何判断问题所在或如何修复。我已经检查了主apache conf文件中是否启用了ssl模块。

有人能提供指导吗?

谢谢。

Meta:这个Q不是编程或开发,可以说是多个问题,但这个半A太长了,无法发表评论。如果需要,我会删除(或同意mod删除)。

请求。。。我想AKA是关键文件吗?

绝对不是,我认为这是你的大部分问题。"公钥"密码学的整个安全性,也被称为"非对称",是基于你从未向任何人发送、给予或以其他方式提供你的私钥。"请求"是CSR,基本上是临时性的;一旦颁发了证书,就不再需要或使用CSR。如果你想保持整洁,你可以删除它。

用户浏览器显示绿色地址栏

绿条仅用于扩展验证(EV)证书,而来自真正的公共CA的证书需要花费相当多的钱。你的公司可能已经调整了所有的电脑(或所有相关的电脑),以接受内部或临时CA对电动汽车有效,但我不明白他们为什么会这么麻烦,因为浏览器几年前就取消了绿条。您现在得到的是HTTPS的URL/地址栏上的挂锁,带有任何有效证书(无论验证类别如何),而对于无效证书,您会得到一个修改或替换挂锁的警告/错误图标和/或一个完整的警告/错误页面。

Cer文件和crt文件是一回事。。。我可能。。。只需重命名文件扩展名。

有点。文件中的(单个)证书和其他一些地方有两种主要的编码:DER也被称为二进制,PEM也被Microsoft base64(错误地)调用。人们对这两种格式都使用不同的扩展.cer .crt(有时也使用其他扩展)。很多软件都可以同时使用这两种方法,但httpd只能在任何名称或扩展名的文件中使用PEM,如果你想要的话,甚至可以使用FeeblyGorp.snork

然而,HTTPS服务器实际上不仅需要一个证书,还需要一个由多个(几乎总是至少2个,通常是3或4个)证书组成的。处理这样的链条有更多的变化。更简单的方法就是获取证书并将它们连接起来。另一种在过去发展起来并仍在使用的方式是一种特殊类型的PKCS7消息,传统上的扩展名为.p7b.p7c(尽管大多数程序都可以处理任何名称,尽管微软一直试图让你相信文件名的扩展名以某种方式控制了内容,但它没有也从来没有这样做过)。Apache只支持PEM方法中的纯序列,而不支持PKCS7方法。

我发送的文件[CSR]是私钥文件

否。请参见上文。

Apache 2.4和早期版本之间有一些变化,所以在查看有关SSL的指南时,我应该小心,以确保它适用于2.4版本。

不仅在2.2和2.4"族"之间有变化,而且在2.4中的点发布之间也有变化。在文档中搜索";版本2.4;看看。如果你试图使用比你运行的版本更新的功能,它几乎肯定会发出错误消息,但如果你使用旧功能,它仍然可以在新版本上工作,只有极少数例外。

我需要在主http配置文件中启用SSL,并将证书文件和服务器的详细信息添加到httpd-SSL.conf文件中

不是。httpd最初读取一个配置文件,如果该文件包含一个或多个引用其他文件的<Include>指令,它也会读取这些指令;我想这就是你所说的"在主配置文件中启用SSL"的意思——你没有这样启用SSL,你使用的是一个碰巧提供SSL配置的文件。httpd可以在一个文件中处理所有配置,但人员通常会发现,将不同的vhosts或SSL配置等逻辑"部分"放在单独的文件中更方便,这些文件可以命名以反映每个文件的内容。简而言之,您必须添加与SSL相关的配置,但不需要将其放在具有特定名称的单独文件中。

因此,net,您的问题是您需要httpd可用的文件中的私钥,这意味着几种PEM格式之一。当您使用MMC/cert创建证书请求时,它会将私钥存储在Windows证书存储的隐藏位置;通常,当你从CA获得结果证书时,你会用MMC将其加载到同一个存储中,并将其与隐藏的私钥进行匹配,以便像IIS这样的Windows特定程序可以同时使用这两个密钥。一旦您这样做,就可以将带有证书的私钥导出为PFX/PKCS12文件,httpd不能直接使用该文件,但如果您拥有或获得了该文件,可以使用OpenSSL将其转换为合适的PEM文件。但是,如果密钥被标记为不可导出,则表示您运气不佳。

获取httpd证书的常见方法是OpenSSL:它可以在PEM文件和CSR中创建私钥,当您获取证书(和链)时,只需将它们与现有私钥组合即可。

最新更新