在 Apache 上使用自签名证书设置 https

在 Apache 上使用自签名证书设置 https

我正在尝试使用自签名证书在 Apache 上设置 HTTPS。但是页面并没有显示,而是出现了一堆奇怪的错误。每个浏览器的错误都不一样!

从 Chrome 中:

错误 2(net::ERR_FAILED):未知错误。

通过 Firefox:

SSL 收到的记录超出了最大允许长度。(错误代码:ssl_error_rx_record_too_long)

我按照http://slacksite.com/apache/certificate.php以及大约 4 个其他指南。它们都差不多,但都给出了相同的结果。所以我一定是做错了什么。

简而言之,这就是我所做的:

  • 生成服务器密钥:

    openssl genrsa -des3 -out server.key 1024

  • 生成 CSR:

    openssl req -new -key server.key -out server.csr

[在生成请求时,我小心地输入了我的实际主机名作为“通用名称(例如,您的姓名或服务器的主机名)”]

  • 从密钥中删除密码:

    cp server.key server.key.org
    openssl rsa -in server.key.org -out server.key

  • 自签名证书:

    openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

  • 配置 apache 以指向这些文件并使用这些证书。

有任何想法吗?

更新:这是我的虚拟主机配置:

LoadModule ssl_module modules/mod_ssl.so
Listen 443
#   Some MIME-types for downloading Certificates and CRLs
#
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl    .crl
SSLSessionCache         shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout  300
SSLMutex default
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin

## Virtual host to redirect to HTTPS
<VirtualHost *:80>
    ServerName mail.craimer.org
    Redirect permanent / https://mail.craimer.org:443
</VirtualHost>

##
## SSL Virtual Host Context
##

<VirtualHost mail.craimer.org:443>
    ServerName mail.craimer.org
    DocumentRoot "/usr/share/roundcubemail/trunk/roundcubemail/"

         ErrorLog logs/ssl_error_log
         TransferLog logs/ssl_access_log
         LogLevel warn

         SSLEngine on

         SSLProtocol all -SSLv2

         SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW

         SSLCertificateFile /etc/httpd/conf/ssl/server.crt
         SSLCertificateKeyFile /etc/httpd/conf/ssl/server.key

         <Files ~ "\.(cgi|shtml|phtml|php3?)$">
                                SSLOptions +StdEnvVars
         </Files>
         <Directory "/var/www/cgi-bin">
                                SSLOptions +StdEnvVars
         </Directory>

    # Deal with broken MSIE
         SetEnvIf User-Agent ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

    CustomLog logs/ssl_request_log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

答案1

该问题更可能出在您的 vhost 配置上。

针对 HTTP 资源启动 HTTPS 会话可能会产生此ssl_error_rx_record_too_long错误。例如 -https://host.name:80

答案2

我过去使用的方法与您详细介绍的方法略有不同。以下说明最初详述于我在寻找如何设置 SSL 时发现的这篇文章中:通过 Active Directory (SSPI) 逐步安装 Apache/SSL 上的 Subversion

总结一下:

  1. 在apache\bin下创建openssl.conf并设置其内容如下:

    [ v3_ca ]
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:始终,发行人:始终
    基本约束 = CA:true
    [ 要求 ]
    默认比特数 = 1024
    default_keyfile = 服务器.key
    专有名称 = 请求专有名称
    属性 = req_attributes
    x509_extensions = v3_ca  
    string_mask = nombstr
    [ 请求可分辨名称 ]  
    commonName = 通用名称
    commonName_default = 我的服务器名称
    [ 请求属性 ]
  2. 打开命令提示符,导航到 apache\bin 并运行以下命令:

    openssl req -config openssl.conf -new -out server.csr

  3. 出现提示时输入密码,然后再次输入以进行验证。

  4. 然后系统将提示您输入通用名称 [我的服务器名称]。输入机器的名称

  5. 接下来使用以下命令从私钥中删除密码(注意这可能会给出无法找到 openssl.conf 的警告 - 可以忽略):

    openssl rsa -in server.key -out server.key

  6. 出现提示时输入之前使用的密码

  7. 接下来使用以下命令创建自签名证书

    `openssl x509 -in 服务器.csr -out 服务器.cert -req -signkey 服务器.key -days 365

  8. 从 apache\bin 文件夹中删除 server.csr 文件。

  9. 将 server.key 和 server.cert 文件从 apache\bin 文件夹复制到 apache\conf 文件夹。

  10. 在文本编辑器中打开 apache\conf\httpd.conf。

  11. 将监听端口指令(可能是 Listen 80 或 Listen 8080)更改为端口 443:

    Listen 443

  12. 更改 ServerName 指令以包含端口 443(注意,这可能被注释掉,因此请删除行首的 # 并将服务器替换为您的服务器名称):

    ServerName server:443

  13. 取消注释或添加 mod_ssl 的加载模块指令(该指令应该存在并被注释掉,因此删除行首的 # ):

    LoadModule ssl_module modules/mod_ssl.so

  14. 为 mod_ssl 添加一个 IfModule 部分(这不应该已经存在,但如果存在则覆盖它):

    <IfModule mod_ssl.c>
        SSLEngine 开启
        SSLRandomSeed 启动内置
        SSLRandomSeed 连接内置
        SSLPassPhraseDialog 内置
        SSLSessionCache dbm:logs/ssl_scache
        SSLSessionCacheTimeout 300
        SSLMutex 默认
        SSL证书文件conf\server.cert
        SSLCertificateKey文件 conf\server.key
    </IfModule>
  15. 重新启动 Apache 服务。通过尝试(并失败)通过 http 连接以及尝试(并成功)通过 https 连接来测试配置。

答案3

好吧,由于用户 Jure1873 还没有写出答案,所以我不能给予他应有的荣誉。这是他的解决方案:

如果<VirtualHost mail.craimer.org:443>用替换会怎样<virtualhost *:443>

这就是解决方案。事实证明(截至本文撰写时)httpd无法支持 HTTPS 的多个虚拟主机,因此任何到 443 的连接都必须定向到单个主机。所以我猜httpd只是默默地拒绝了尝试运行 HTTPS 虚拟主机的配置。

哦,不要因为这个“缺失的功能”而抱怨 Apache。这不是他们的错!HTTPS 协议不支持虚拟主机。

无聊的解释:

您会看到,当您连接到端口 443 并启动 HTTPS 会话时,所发生的只是安全协商。HTTPS 只是在两点之间建立安全隧道,与 HTTP 无关。只有隧道建立后,数据才会流过。该数据是 HTTP 流。

这意味着该Host:指令(属于 HTTP 的一部分,而非 HTTPS)仅在安全隧道构建后才会发送。它是标Host:头,用于告诉 HTTP 服务器正在访问哪个虚拟主机。但在 HTTPS 中,我们获取此信息太晚了:它到达时我们已不得不选择加密密钥。

底线:HTTPS无法根据以下情况选择加密密钥HTTP主机名。

答案4

以下是发生此错误的其他一种情况:

VirtualHost *:80在中定义sites-enabled/000-default.conf。然后定义VirtualHost *:443

httpd.conf

如果您将配置完全移至 或httpd.conf,则000-default.conf它可以正常工作。否则,您会在 FireFox 上收到此错误:

SSL received a record that exceeded the maximum permissible length. (Error code: ssl_error_rx_record_too_long)

在 Chrome 上出现以下错误:

This site can’t provide a secure connection
... sent an invalid response.

相关内容