我有一个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中创建私钥,当您获取证书(和链)时,只需将它们与现有私钥组合即可。