我有以下设置:
- Apache 2.4
- Ubuntu 16.04 LTS
- letsencrypt/certbot
现在,只要我在默认服务器上启用以下 .conf,我配置的所有顶级域都会收到 SSL_ERROR_RX_RECORD_TOO_LONG 错误。如果我禁用此配置,一切都会按预期工作。
由于这个事实,我确信 apache 监听了正确的端口和正确的 IP,并且 letsencrypt/certbot 设置正确。
<VirtualHost _default_:443>
DocumentRoot "/var/www/html"
<Directory "/var/www/html">
Require all denied
</Directory>
</VirtualHost>
将其更改为
<VirtualHost _default_:443>
DocumentRoot "/var/www/html"
<Directory "/var/www/html">
Require all granted
</Directory>
</VirtualHost>
问题还没有解决。
apache2ctl -S
显示预期结果,001-default-ssl.conf 和 001-default.conf 是端口 80 和端口 443 的默认值。
openssl s_client -connect workingdomain.tld:443
印刷:
已连接(00000003) 139991513372312:错误:140770FC:SSL例程:SSL23_GET_SERVER_HELLO:未知协议:s23_clnt.c:794: --- 没有可用的对等证书 --- 未发送客户端证书 CA 名称 --- SSL 握手已读取 7 个字节并写入 305 个字节 --- 新的,(无),密码是(无) 不支持安全重新协商 压缩:无 扩展:无 未协商 ALPN SSL 会话: 协议:TLSv1.2 密码:0000 会话 ID: 会话 ID-ctx: 主密钥: 关键参数:无 PSK 身份:无 PSK 身份提示:无 SRP 用户名:无 开始时间:1515852550 超时:300(秒) 验证返回代码:0(确定) ---
再次,一旦我禁用此配置,每个使用 certbot/letsencrypt 配置的域都会按预期工作。
我不明白这一点,因为我基本上只阻止了默认服务器,所以我的所有其他域名都不应受到此设置的影响。
答案1
您必须指向您的 SSL 证书 -
<VirtualHost _default_:443>
ServerName example.com
ServerAlias www.example.com
ServerAdmin [email protected]
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
CustomLog ${APACHE_LOG_DIR}/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
DocumentRoot /var/www-example.com
<directory /var/www-example.com>
Options All
AllowOverride All
Require all granted
</directory>
ErrorLog ${APACHE_LOG_DIR}/ssl-example.com-error.log
CustomLog ${APACHE_LOG_DIR}/ssl-example.com-access.log combined
</VirtualHost>
如果您想为多个域名提供服务,您仍然可以这样做,至少对于理解 SNI/etc 的现代浏览器来说是这样。
首先,为每个域获取单独的 letsencrypt 证书。如果您有多个主机名(即www.example.com
和example.com
),它们可以共享,只要实际域相同即可。
letsencrypt certonly -d example1.com -d www.example1.com -d mail.example1.com
letsencrypt certonly -d example2.com -d www.example2.com -d mail.example2.com
这将为您提供目录下的 2 组证书/etc/letsencrypt/live/DOMAIN/
。
当您创建 vhost 配置时,不要指定_default_:443
使用主机的实际 IP 并指向适当的证书文件。
<VirtualHost 10.0.1.2:443>
ServerName example1.com
ServerAlias www.example1.com
ServerAdmin [email protected]
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example1.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example1.com/privkey.pem
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
CustomLog ${APACHE_LOG_DIR}/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
DocumentRoot /var/www-example1.com
<directory /var/www-example1.com>
Options All
AllowOverride All
Require all granted
</directory>
ErrorLog ${APACHE_LOG_DIR}/ssl-example1.com-error.log
CustomLog ${APACHE_LOG_DIR}/ssl-example1.com-access.log combined
</VirtualHost>
<VirtualHost 10.0.1.2:443>
ServerName example2.com
ServerAlias www.example2.com
ServerAdmin [email protected]
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example2.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example2.com/privkey.pem
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
CustomLog ${APACHE_LOG_DIR}/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
DocumentRoot /var/www-example2.com
<directory /var/www-example2.com>
Options All
AllowOverride All
Require all granted
</directory>
ErrorLog ${APACHE_LOG_DIR}/ssl-example2.com-error.log
CustomLog ${APACHE_LOG_DIR}/ssl-example2.com-access.log combined
</VirtualHost>
我不会在我的网站上收集表单信息等,但我希望所有内容都运行 HTTPS,因此我设置了 vhost 配置,将非 HTTPS 请求重定向到 HTTPS 端,并使用非命名的 catch-all 重定向到 example1.com -
<VirtualHost *:80>
RewriteEngine on
RewriteRule ^/(.*)$ https://example1.com/$1 [R,L]
</VirtualHost>
<VirtualHost *:80>
ServerName example1.com
ServerAlias www.example1.com
RewriteEngine on
RewriteRule ^/(.*)$ https://example1.com/$1 [R,L]
</VirtualHost>
<VirtualHost *:80>
ServerName example2.com
ServerAlias www.example2.com
RewriteEngine on
RewriteRule ^/(.*)$ https://example2.com/$1 [R,L]
</VirtualHost>