我有几个网站使用 StartSSL 免费证书 (CJSHayward.com,JobhuntTracker.com),Firefox 拒绝 StartSSL 并显示错误页面,指出我的服务器配置不正确(如果我没记错的话),原因是证书链。我寻求帮助,并确认我的 VirtualHost(可应要求提供)适用于证书链,并且我已正确安装中间证书。据我所知,网站在 Chrome、Safari、Edge 或 Opera 中显示时没有错误。
经过一番搜索,让我们加密!看起来是个很有吸引力的产品,不久之后,我就在 /etc/apache2/sites-enabled 下为每个域名(当然,不包括不再属于我的域名)都获得了私钥和证书。我想试运行一下,并与现在只能在 HTTP 下使用的站点建立 HTTPS 连接:JSH.名称我将“Let's Encrypt!”证书和私钥移至我的 SSL 目录并添加:
<VirtualHost *:443>
ServerAdmin [email protected]
DocumentRoot /home/jonathan/stornge
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/0000_csr-letsencrypt.pem
SSLCertificateKeyFile /etc/apache2/ssl/0000_key-letsencrypt.pem
ServerName jsh.name
ServerAlias www.jsh.name
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
CustomLog /home/jonathan/logs/stornge.com combined
<Directory /home/jonathan/stornge/>
Options ExecCGI Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
</VirtualHost>
然后我重启查看我的工作,结果我发出的每个 HTTP 或 HTTPS 请求都挂了。这包括两个使用我的 StartSSL 证书的 HTTPS 域名,以及一个应该可以通过 HTTP 和 HTTPS 访问的 HTTPS 域名。我注释掉了 VirtualHost 并重启了 Apache,所有旧功能都恢复了正常运行。
我是否正确使用了 Let's “Encrypt!”?我有点怀疑,因为现有的 SSL 配置具有扩展名为 .key 的私钥、扩展名为 .crt 的证书以及扩展名为 .pem 的证书链文件。
检查 SSL 目录后,我再次尝试,发现 0000_csr.letsencrypt.pem 的模式为 644;我将该目录中的所有文件更改为模式 600。刚才尝试时,我得到了旧行为的重复:网站挂起所有请求,此外,还apachectl restart
收到一条声明(我忘记了确切的措辞),httpd 未运行,计算机正在尝试启动它。
我如何才能获得“Let's Encrypt”或其他未疏远 Firefox 的工具的免费工作证书?
给出apachectl -v
:
Server version: Apache/2.4.10 (Debian)
Server built: Nov 28 2015 14:05:48
Auname -a
给出:
Linux www 4.4.0-x86_64-linode63 #2 SMP Tue Jan 19 12:43:53 EST 2016 x86_64 GNU/Linux
- 更新 -
内容已删除,0000_key-letsencrypt.pem 受以下限制:
-----BEGIN PRIVATE KEY-----
-----END PRIVATE KEY-----
对目录层次结构的查找得出:
root@www:/etc/letsencrypt# find `pwd` -print /etc/letsencrypt /etc/letsencrypt/密钥 /etc/letsencrypt/keys/0000_key-letsencrypt.pem /etc/letsencrypt/账户 /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory/1ef8dc9b994b9b68a4e9c7cedd003be3 /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory/1ef8dc9b994b9b68a4e9c7cedd003be3/private_key.json /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory/1ef8dc9b994b9b68a4e9c7cedd003be3/meta.json /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory/1ef8dc9b994b9b68a4e9c7cedd003be3/regr.json /etc/letsencrypt/更新 /etc/letsencrypt/options-ssl-apache.conf /etc/letsencrypt/csr /etc/letsencrypt/csr/0000_csr-letsencrypt.pem
目录 /home/jonathan/stornge 及其内容是全世界可读的,也是全世界可执行的,这一点会有所不同。
- 更新 -
在这里添加一些实质性内容:
这http://OrthodoxChurchFathers.comApache conf 文件有两个 VirtualHosts,一个用于提供服务http://OrthodoxChurchFathers.com和一个重定向http://www.OrthodoxChurchFathers.com请求http://OrthodoxChurchFathers.com。两个 VirtualHost 的 .conf 文件如下:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName orthodoxchurchfathers.com
#ServerAlias www.orthodoxchurchfathers.com fathers.jonathanscorner.com
DocumentRoot /home/cjsh/fathers/document_root
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /home/cjsh/fathers>
Options ExecCGI FollowSymLinks Indexes MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
DirectoryIndex index.cgi index.html
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName www.orthodoxchurchfathers.com
ServerAlias fathers.jonathanscorner.com
DocumentRoot /home/cjsh/oldmirror
RewriteEngine On
RewriteRule ^(.*)$ http://orthodoxchurchfathers.com$1 [R=301,L]
</VirtualHost></pre></code>
When I try to run it and request orthodoxchurchfathers.com alone, I get:
┌──────────────────────────────────────────────────────────────────────┐
│ We were unable to find a vhost with a ServerName or Address of │
│ orthodoxchurchfathers.com. │
│ Which virtual host would you like to choose? │
│ (note: conf files with multiple vhosts are not yet supported) │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │1 008-stornge.conf | Multiple Names | │ │
│ │2 014-paraskeva.conf | paraskeva.jonathansco | │ │
│ │3 036-unixytalk.conf | unixtalk.jsh.name | │ │
│ │4 038-proxy.conf | Multiple Names | │ │
│ │5 027-anna.conf | Multiple Names | │ │
│ │6 044-jobhunt-tracker.creation.c | Multiple Names | │ │
│ │7 049-jsh.conf | Multiple Names | │ │
│ │8 001-steampunk.conf | | │ │
│ │9 006-blajeny.conf | Multiple Names | │ │
│ │10 032-videos.conf | Multiple Names | d│ │
│ └────↓(+)──────────────────────────────────────────────────30%─────┘ │
├──────────────────────────────────────────────────────────────────────┤
│ │
└──────────────────────────────────────────────────────────────────────┘
The command I used was with ./letsencrypt-auto --debug certonly
。
答案1
我编写了两个关于在 CentOS 上运行 Let's Encrypt SSL 证书的操作指南:初始设置&记录它。
我的每个域(我使用文件命名约定z-<[sub-]domain-tld>.conf
)的 Apache 配置文件如下所示:
<VirtualHost *:80>
ServerName domain.tld
Redirect permanent / https://domain.tld/
</VirtualHost>
<VirtualHost *:443>
SSLCertificateFile /etc/letsencrypt/live/domain.tld/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domain.tld/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/domain.tld/fullchain.pem
DocumentRoot /var/www/domain
ServerName domain.tld
ErrorLog logs/domain-error_log
CustomLog logs/domain-access_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
ServerAdmin [email protected]
SSLEngine on
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
<Directory "/var/www/domain">
Options All +Indexes +FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
我的 ssl.conf 如下所示:
#SSL options for all sites
Listen 443
SSLPassPhraseDialog builtin
SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout 300
Mutex sysvsem default
SSLRandomSeed startup file:/dev/urandom 1024
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
SSLCompression off
SSLHonorCipherOrder on
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
使用 Let's Encrypt 获取 SSL 证书(并使您的网站获得“A”评级SSL 实验室) 非常简单 - 一旦您了解了 Apache 配置和 LE 命令行参数的一些秘密。
答案2
我找到客户了尖端运行良好,设置和启动都很简单,定期更新,易于更新,在 Amazon Linux 上运行良好。我写了一个教程,你可以找到这里。
首先下载 ACME 并进行设置
https://github.com/hlandau/acme.git
cp ./acmetool /usr/local/bin
/usr/local/bin/acmetool quickstart
请求证书
./acmetool want example.com www.example.com
这是我为挑战设置的目录 - 这是 Let's Encrypt 连接到你的服务器进行验证的地方
mkdir -p /var/www/acme-challenge/.well-known/acme-challenge
chmod -R user:www-data /var/www/acme-challenge/*
find /var/www/acme-challenge/ -type d -exec chmod 755 {} \;
vi /var/www/acme-challenge/.well-known/acme-challenge/text.html (add "hello world!" or similar)
上面链接的网站上有更多详细信息和评论,作者和社区也很有帮助。
答案3
我使用 EFF 取得了很好的效果Certbot在 Web 根模式下(因为在证书更新期间,自动化流程会停止 Web 服务器,即使只是短暂地停止,这种想法让我感到害怕)。
首先,安装 Certbot。如果你使用的是 Debian Jessie(在我写这篇文章时是最新版本),首先添加jessie-backports
存储库,然后
$ sudo apt-get install python-certbot-apache -t jessie-backports
这将带来一些软件包以及 certbot 本身。
然后,在中创建证书网页根目录模式,运行类似
$ sudo certbot certonly --webroot -w /srv/www/www.example.net/htdocs -d www.example.net
如果您想要除默认值(当前为 2048 位)之外的模数大小,则可以选择添加--register-unsafely-without-email
以及。可以重复任意次数,也可以;每个都启动从目录中提供的一组新域,这些域由 命名。 Let's Encrypt 不颁发通配符证书(这在其常见问题解答中提到),显然也不颁发 Punycode 域名证书。--rsa-key-size X
-d fqdn.example.com
-w
-w
-d
运行的用户certbot
至少需要默认对 下的多个位置具有写入权限/etc/letsencrypt
。最简单的方法可能是以 root 身份运行它。它将在.well-known/acme-challenge
给定的 Web 根目录 ( -w
) 下创建一个文件,让远程系统验证其是否可访问通过指定的域名通过 HTTP,如果一切检查无误,将会在 中创建一堆 PEM 文件/etc/letsencrypt/archive/www.example.net
以及一组相应的符号链接,/etc/letsencrypt/live/www.example.net
并打印一条友好的成功消息。
如果一切顺利,剩下要做的就是设置您的 Web 服务器,以使用在主机名子目录中找到的证书/etc/letsencrypt/live
为相关域提供 HTTPS。对于 Apache 来说,这方面的最低要求类似于:
<VirtualHost *:443>
ServerName www.example.net
SSLEngine on
SSLCertificateKeyFile /etc/letsencrypt/live/www.example.net/privkey.pem
SSLCertificateFile /etc/letsencrypt/live/www.example.net/cert.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.example.net/chain.pem
</VirtualHost>
根据需要添加任何其他指令,使用apache2ctl -S
和验证apache2ctl configtest
一切是否检查完毕,然后使用激活 HTTPS 虚拟主机apache2ctl graceful
。
不要忘记定期更新证书;目前,Let's Encrypt 证书在 90 天后过期。Debian 软件包附带一个 cron 作业/etc/cron.d/certbot
和一个 systemd 服务来/lib/systemd/system/certbot.service
处理此问题,或者您可以certbot renew
手动运行。记得apache2ctl graceful
开始使用新颁发的证书;您可能需要调整 cron 作业或 systemd 服务以自动执行此操作。要将更新的证书自动加载到 Debian Jessie 上的 Apache 中,请考虑更新/lib/systemd/system/certbot.service
以添加到该[Service]
部分(注意:顺序很重要):
ExecStartPost=/usr/sbin/apache2ctl configtest
ExecStartPost=/usr/sbin/apache2ctl graceful
这样做将自动加载更新的证书如果Apache 配置文件通过,并且如果或失败,configtest
则将 Certbot 列为失败单元。configtest
graceful