如何在 VPS 上设置 Apache 并使用免费签名的 SSL 证书

发布于:2024-12-06 ⋅ 阅读:(23) ⋅ 点赞:(0)

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

注意:您可能希望考虑使用 Let’s Encrypt 而不是下面的 StartSSL.com 过程。Let’s Encrypt 是一个新的证书颁发机构,提供了一种免费简单的方式来创建在大多数 Web 浏览器中受信任的 SSL/TLS 证书。查看教程以开始:如何在 Ubuntu 14.04 上使用 Let’s Encrypt 安全 Apache

先决条件

在开始之前,以下是本教程所需的 Web 工具:

<ol>
    <li><a href="https://www.google.com/intl/en/chrome/browser">Google Chrome</a> 浏览器</li>
    <li>已在您的 VPS(云服务器)上安装了 Apache</li>
    <li>您拥有的域名</li>
    <li>可以访问该域名的电子邮件地址,可以是以下之一:
        <ol>
            <li>postmaster@duable.co</li>
            <li>hostmaster@duable.co</li>
            <li>webmaster@duable.co</li>
        </ol>
    </li>
</ol>

StartSSL.com 提供完全免费的已验证(您的用户将不再看到那些可怕的红色屏幕,显示“此站点不受信任”)SSL 证书,您可以在您的网站上使用。这是一个很好的交易,因为大多数公司收取类似服务的 $50 到 $60。免费版本有点难以设置,但非常值得。

<p要开始,请浏览到 StartSSL.com 并使用左侧的工具栏导航到 StartSSL 产品,然后到 StartSSL™ Free。选择页面顶部的 控制面板 链接。

确保您正在使用 Google Chrome

<ol>
    <li>选择 <strong>快速注册</strong> 选项</li>
    <li>输入您的个人信息,然后单击继续。</li>
    <li>您将很快收到一封带有验证代码的电子邮件。将该电子邮件复制并粘贴到 StartSSL 网站上的表单中。</li>
    <li>他们将审核您的证书请求,然后发送一封带有新信息的电子邮件。这个过程可能需要长达 6 小时,所以请耐心等待。</li>
    <li>一旦收到邮件,使用提供的链接和新的验证代码(在邮件底部)继续下一步。</li>
    <li>他们将要求您生成一个私钥,并提供“高”或“中”级别的选择。继续选择“高”。</li>
    <li>一旦您的密钥准备就绪,点击安装。</li>
    <li>Chrome 将显示一个下拉菜单,指出证书已成功安装到 Chrome。</li>
</ol>


<p这意味着您的浏览器现在已经使用您的新证书进行了身份验证,您可以使用您的新证书登录 StartSSL 认证区域。现在,我们需要为您的 VPS 设置一个格式正确的证书以供使用。再次点击 <a href="https://www.startssl.com/?app=12">控制面板</a> 链接,并选择认证选项。Chrome 将显示一个弹出窗口询问您是否要进行身份验证,并显示您刚刚安装的证书。继续使用该证书进行身份验证以进入控制面板。</p>

<p您需要验证您的域名以证明您拥有要设置证书的域名。转到 <a href="https://www.startssl.com/?app=12">控制面板</a> 中的验证向导,并将类型设置为域名验证。您将被提示从您域名的电子邮件中选择一个,例如 postmaster@yourdomain.com。</p>
StartSSL

<p检查您选择的电子邮件地址的收件箱。您将在该地址收到另一封验证电子邮件,因此像之前一样,将验证代码复制并粘贴到 StartSSL 网站中。

<p接下来,转到证书向导选项卡,并选择创建 Web 服务器 SSL/TLS 证书。

Start SSL

<p点击继续,然后输入一个安全密码,将其他设置保持不变。

<p您将看到一个包含您的私钥的文本框。将内容复制并粘贴到文本编辑器中,并将数据保存为 ssl.key 文件。

Private Key

<p单击继续后,将被询问要为哪个域名创建证书:

Choose Domain

<p选择您的域名并继续下一步。

<p您将被询问要为哪个子域名创建证书。在大多数情况下,您希望在这里选择 www,但如果您想要使用不同的子域名进行 SSL,则在此处输入该子域名:

Add Subdomain

<pStartSSL 将在文本框中为您提供新的证书,就像它为私钥所做的那样:

Save Certificate

<p同样,将其复制并粘贴到文本编辑器中,这次将其保存为 ssl.crt。

<p为了验证您的网站,您还需要 StartCom 根 CA 和 StartSSL 的 Class 1 中间服务器 CA,因此,最后一步,转到工具箱窗格,并选择 StartCom CA 证书:

Startcome CA Certs

<p在此屏幕上,右键单击并另存两个文件:

<ul>
    <li>StartCom 根 CA(PEM 编码)(保存为 ca.pem)</li>
    <li>Class 1 中间服务器 CA(保存为 sub.class1.server.ca.pem)</li>
</ul>

<p出于安全原因,StartSSL 加密您的私钥(ssl.key 文件),但您的 Web 服务器需要其未加密版本来处理您站点的加密。将其复制到您的服务器上,并使用以下命令将其解密为 private.key 文件:

openssl rsa -in ssl.key -out private.key

<pOpenSSL 将要求您输入密码,因此输入您在 StartSSL 网站上输入的密码。

<p此时,您应该有五个文件。如果您缺少任何文件,请仔细检查之前的步骤并重新下载它们:

<ul>
    <li>ca.pem - StartSSL 的根证书</li>
    <li>private.key - 您的私钥的未加密版本(非常小心,确保没有其他人可以访问此文件!)</li>
    <li>sub.class1.server.ca.pem - StartSSL 的中间证书</li>
    <li>ssl.key - 您的加密私钥的版本(不需要复制到服务器)</li>
    <li>ssl.crt - 您的新证书</li>
</ul>

<p您可以丢弃 ssl.key 文件。如果您尚未将其他文件复制到服务器上,请立即将它们上传到服务器:

scp {ca.pem,private.key,sub.class1.server.ca.pem,ssl.crt} YOURSERVER:~ 
<h2>在 Apache 中激活证书</h2>

<p如果您无法使用证书,那么拥有证书也没有什么好处。本节解释了如何配置 Apache 来使用您的新 SSL 证书。这些说明适用于运行最新版本 Ubuntu VPS 上的 Apache。对于其他基于 Linux 的发行版或 Web 服务器,您需要相应地进行调整。

<p首先,创建我们将存储密钥的文件夹。启用 Apache 的 SSL 模块,并重新启动 Apache。

sudo a2enmod ssl
sudo service apache2 restart
sudo mkdir -p /etc/apache2/ssl

<p将在上一节中设置的文件复制到 VPS 上的 /etc/apache2/ssl 文件夹中。

sudo mkdir -p /etc/apache2/ssl
cp ~/{ca.pem,private.key,sub.class1.server.ca.pem,ssl.crt} /etc/apache2/ssl

<p执行:

ls /etc/apache2/ssl

<p应返回:

ca.pem
ssl.crt
private.key
sub.class1.server.ca.pem

<p现在,打开您的 apache2 配置文件。除非您已经修改了默认配置,否则输入:

nano /etc/apache2/sites-enabled/000-default

<p它应该看起来像这样:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost

    DocumentRoot /var/www
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

    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>

<p复制上面的整个脚本(从 <VirtualHost *:80> 到 </VirtualHost>),粘贴到现有脚本下方,并将顶部行从:

<VirtualHost *:80>

<p更改为

<VirtualHost *:443>

<p并在 <VirtualHost *:443> 行之后添加以下行:

SSLEngine on                                                                
SSLProtocol all -SSLv2                                                      
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM                

SSLCertificateFile /etc/apache2/ssl/ssl.crt                           
SSLCertificateKeyFile /etc/apache2/ssl/private.key                        
SSLCertificateChainFile /etc/apache2/ssl/sub.class1.server.ca.pem 

<p最终结果应如下所示:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost

    DocumentRoot /var/www
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

    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 *:443>
    SSLEngine on                                                                
    SSLProtocol all -SSLv2                                                      
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM                

    SSLCertificateFile /etc/apache2/ssl/ssl.crt                           
    SSLCertificateKeyFile /etc/apache2/ssl/private.key                        
    SSLCertificateChainFile /etc/apache2/ssl/sub.class1.server.ca.pem 
    ServerAdmin webmaster@localhost

    DocumentRoot /var/www
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

    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>

<p保存您的文件,并使用以下命令重新启动 Apache:

sudo service apache2 restart

<p您可以使用以下命令检查 Apache 的日志文件,以查看是否有任何阻止错误:

cat /var/log/apache2/error.log

<p如果一切正常,请尝试在 Web 浏览器中使用 HTTPS URL(例如 https😕/www.YOURSITE.com)访问您的站点。当您的站点加载时,您应该在 URL 旁边看到一个小绿色的挂锁图标。单击它,您应该看到以下内容。连接选项卡应显示该站点的身份已由 StartCom 验证。

<img style=“border:2px solid black; display:block;margin-left:auto;margin-right:auto” src="