上周写了一篇文章讲了讲为什么应该使用 HTTPS 加密你的网站,并笼统的介绍了如何申请和使用 Let's Encrypt 提供的 SSL 证书。这次我们说说如何在 CentOS 6 和 Nginx 中部署 Let's Encrypt 的 SSL 证书,过程中可能遇到的问题,以及如何解决。

整体上分成申请证书和使用证书两个部分。

申请证书

准备工作

在申请证书之前,你必须有一个域名,并配置好 DNS 解析服务,使其指向你将要使用的服务器。说白了,就是你要保证所有人都可以通过在浏览器中输入域名打开你的网站。

此时 Nginx 的配置文件如下(为了便于说明只包含了最基本的信息):

server {
    listen 80;
    server_name www.bnlt.org;
    
    location / {
        root /usr/share/Nginx/html;
    }
}

其中 80 是 http 协议默认端口,www.bnlt.org 是我的域名,/usr/share/Nginx/html 是网站根目录。

安装 Certbot

Certbot 是 Let's Encrypt 官方推出的,用来获取 SSL 证书的工具。Certbot 的官网为各大主流操作系统和 Web 服务器提供了安装和使用的指南。下面首先介绍官方提供的方法。

> 下列操作均在 root 用户权限下执行。

官方推荐

针对 CentOS 6 系统,官方推荐的是使用 certbot-auto 脚本。安装方法如下:

wget https://dl.eff.org/certbot-auto  
chmod a+x certbot-auto

第一个命令将 certbot-auto 下载到当前目录下,第二个命令给予执行权限。

这是一个 shell 脚本,可以通过在当前目录下执行 ./certbot-auto 来调用。

它首先检查你是否已经安装了最新版本的 certbot,如果尚未安装,则调用 yum 检查和安装相关的依赖,其中包括了 python、python-dev 和 python-pip,然后创建一个虚拟环境(相对独立的、运行 python 的虚拟环境,在里面安装的依赖和库独立于操作系统使用的 python 环境,可以避免影响主系统的运行),在这个虚拟环境里安装一个最新版本的 certbot。用户交给 certbot-auto 的参数都被委派给这个安装在虚拟环境中的 certbot 来执行。

由于这个 certbot 被安装在虚拟环境里,你不能直接在命令行里使用 certbot 命令,只能通过 certbot-auto 脚本间接使用它。

不过使用 certbot-auto 脚本有时会遇到问题,表现为虚拟环境创建完毕后,长时间卡在安装 Python 包的步骤:

Creating virtual environment...
Installing Python packages...

这通常被认为是 pip 的源在国内访问受限导致。

直接使用 pip 安装 certbot

上面讲到了,certbot-auto 是先安装 python-pip,再通过 python-pip 来安装 certbot 的,所以我们也可以自己手动来完成这个过程。通过这个方法安装的 certbot 会成为一个全局的命令,具体安装在 /usr/bin/certbot 。

如果你想自己安装 certbot,我仍然建议你先执行一下 certbot-auto 命令,让它先帮你安装好相关的依赖。

默认情况下 certbot-auto 也会为你安装 python 和 python-pip,但是版本教旧的 python2.6 和 pip7.1,,虽然用来安装和使用 certbot 是完全没有问题的,但每次执行时都会提示你当前使用的版本较老,官方已不再支持,有安全隐患。

我使用的是 python2.7 以及 pip9.0,可以通过添加 IUS 的源来安装。

添加 IUS 源

yum install https://centos6.iuscommunity.org/ius-release.rpm

安装 python2.7 和 pip9.0+

yum install python27 python27-devel python-pip

其中 python27-devel 是运行 certbot 必需的。

全局安装 certbot

pip install certbot

如果 pip install 速度很慢或卡进度,可以尝试设置 pip 的源为阿里云的镜像,再尝试上面的命令。

在当前用户目录下建立 ~/.pip/pip.conf 文件。内容如下:

[global]
index-url = http://mirrors.aliyun.com/pypi/simple/

[install]
trusted-host=mirrors.aliyun.com

安装完毕后,你会得到一个新命令 certbot,用 which 命令可以查到其安装的位置。

which certbot
/usr/bin/certbot

获取证书

现在可以使用 certbot 获取 SSL 证书了。

> 如果你使用官方脚本,将下列命令中的所有 certbot 替换为 ./certbot-auto 即可。

这里我们使用 certbot certonly --webroot 方式来获取证书,此命令借助已有的 Web 服务实现认证,并生成证书,命令执行过程中不会对网站的正常运行造成影响,以后给证书续期也更平滑。

完整的命令如下:

certbot certonly --webroot -w /usr/share/Nginx/html -d www.bnlt.org

-w 参数指定了网站的根目录,-d 参数指定了网站的域名。

背后的原理大致如下:执行命令的计算机会和 Let's Encrypt 的服务器进行通信,商定一个字符串,这个字符串以文件的形式保存在-w 参数指定的路径下的 .well-kNown/acme-challenge/ 目录中,服务器再访问 -d 指定的网站目录下的相应文件来进行核实。核对成功就可以基本证明这个域名确实归你所有,Let's Encrypt 就会为你颁发相应的证书了。

> 实际上只能证明当前是你控制了这个域名的解析,如果域名解析被他人恶意控制或污染,他也能生成此域名的证书,因此 Let's Encrypt 提供的证书仅能用于加密,保证信息在传输过程中不被篡改,但不能用来证明域名的所有权。从这个角度来看,只要攻击者能控制或污染域名解析,即使你访问的某个网站显示了绿锁,仍有可能是个钓鱼网站。

执行此命令后,会弹出一个界面问你是否接受相关的协议,选择 OK 并确认即可。你也可以在执行上述命令时加上 --agree-tos 自动接受协议以跳过此步骤。

如果服务器配置正确,命令行参数也无误,那么就能成功完成,提示如下:

- Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/www.bnlt.org/fullchain.pem. Your cert will
   expire on 2017-01-30. To obtain a new or tweaked version of this
   certificate in the future,simply run certbot again. To
   non-interactively renew *all* of your certificates,run
   "certbot renew"

提示信息告诉你证书存放在 /etc/letsencrypt/live/www.bnlt.org 目录下,过期时间是 2017-01-30,最后还告诉你续期的方法是执行 certbot renew

而最常见的错误提示如下:

An unexpected error occurred:
The request message was malformed :: No such challenge

遇到这样的情况是因为 Let's Encrypt 的服务器无法在你的网站上找到验证用的文件。你首先要检查 -w-d 参数是否有误,是否把验证文件放在了别的目录下或者填错了域名,另外还要确保 Let's Encrypt 的服务器能访问到你的网站,比如你是刚做的域名解析,可能对它所处的网络而言域名解析尚未生效。

使用证书

要在 Nginx 中用刚才得到的证书来启用 https ,需要将配置文件改为:

server {
    listen 443 ssl;
    server_name www.bnlt.org;
    
    ssl_certificate /etc/letsencrypt/live/www.bnlt.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.bnlt.org/privkey.pem;

    location / {
        root /usr/share/Nginx/html;
    }
}

和原来的配置文件相比主要有两处变化,一是将 listen 端口改为 https 协议的默认端口 443,并加上 ssl 说明是加密连接。

还有就是增加了 ssl_certificatessl_certificate_key,前者指定公钥,后者指定私钥。

保存配置文件,执行 /etc/init.d/Nginx reload 使新配置生效

http 自动跳转 https

如果你想更进一步,对所有用户强制使用 https,可以在配置文件里增加如下内容:

server {
    listen 80;
    server_name www.bnlt.org;
    return 301 https://$server_name$request_uri;
}

此配置会将所有通过 80 端口的 http 协议访问的用户,安全的跳转到对应的 https 版本页面。

同样,执行 /etc/init.d/Nginx reload 使新配置生效。

在 CentOS 6 和 Nginx 中部署 Let's Encrypt 的 SSL 证书的更多相关文章

  1. PhoneGap / iOS上的SQLite数据库 – 超过5mb可能

    我误解了什么吗?Phonegap中的sqlitedbs真的有5mb的限制吗?我正在使用Phonegap1.2和iOS5.解决方法您可以使用带有phonegap插件的原生sqliteDB,您将没有任何限制.在iOS5.1中,Websql被认为是可以随时删除的临时数据…

  2. ios – 使用带有NodeJs HTTPS的certificates.cer

    我为IOS推送通知生成了一个.cer文件,我希望将它与NodeJSHTTPS模块一起使用.我发现HTTPS模块的唯一例子是使用.pem和.sfx文件,而不是.cer:有解决方案吗解决方法.cer文件可以使用两种不同的格式进行编码:PEM和DER.如果您的文件使用PEM格式编码,您可以像使用任何其他.pem文件一样使用它(有关详细信息,请参见Node.jsdocumentation):如果您的文件使

  3. ios – 应该加密APNS令牌吗?

    所以,我想知道,因为用户将APNS令牌发送给APNS提供商以便接收推送通知,是否应该加密令牌?另外,我认为根据APNS令牌识别设备是不可能的?因此,我想确保,如果有人从我的一个客户端嗅探推送通知注册...>他仍然必须获得我的推送证书才能以任何方式打扰我的客户>他知道有人对这些信息感兴趣,但无法确定我的客户是谁我可以放心吗?

  4. ios – CFNetwork内部错误:URLConnectionLoader.cpp:289

    当我在一段时间后打开我的应用程序时,我收到了日志:440:CFNetworkinternalerror(0xc01a:/buildroot/Library/Caches/com.apple.xbs/Sources/CFNetwork/CFNetwork-758.4.3/Loading/URLConnectionLoader.cpp:289)它从未出现在过去.我的项目使用网络库AFNetworkin

  5. ios – 使用大写符号在字符串swift中获取URL的正则表达式

    我尝试在文本中获取URL.所以,在此之前,我使用了这样一个表达式:但是当用户输入带有大写符号的URL时(例如Http://Google.com,它与它不匹配)我遇到了问题.我试过了:但什么都没发生.解决方法您可以使用正则表达式中的i内联标志关闭区分大小写,有关可用正则表达式功能的详细信息,请参阅FoundationFrameworkReference.(?ismwx-ismwx)Flagsetti

  6. iOS Enterprise Deployement:单击itms-services链接会导致“无法连接到[域]”错误

    解决方法我有这个问题,这里没有任何记录的解决方案,或者在其他答案中,没有为我工作.使用正确的SSL证书,可以在目标设备上的safari中加载plist,没有任何问题.但是,尝试使用“itms-services://…”链接进行安装将始终失败,并显示“无法连接到[域]”错误.问题是Web服务器上未配置中间SSL证书.Web浏览器没有问题,SSL有效,但将设备连接到Mac,并通过XCode中的设备面板查看日志显示以下错误:在Apache上安装中间SSL证书解决了这个问题.

  7. ios – xcode在更新可可豆荚后出现体系结构错误的重复符号

    编辑:执行下面显示的解决方案后,我的项目只编译iPadAir,我不能再存档,我仍然得到相同的错误…

  8. ios – UIWebView中的WebSQL / SQLite数据库的最大大小(phonegap)

    我知道一般来说,Web应用程序的本地存储空间有5MB的限制.本地网页浏览应用程式是否也有这个限制?

  9. ios – 我可以使用自签名SSL证书服务器在空中部署企业应用吗?

    iOS7.1之后,如果我们要通过空中部署我们的Enterprise应用程序,则manifest.plist文件的URL必须是HTTPS.例如:在我的服务器中,我使用自签名SSL证书.当我点击iPhone上的URL时,它表示无法连接到并记录典型的所以,我想知道我是否可以使用自签名SSL证书?如果可以,我如何解决我遇到的问题的问题?

  10. ios – 如何使用YouTube API V3?

    我想知道如何在iOS应用中使用新的YouTubeAPI(第3版),但我不知道如何做.我做了很多关于它的研究,但是我发现所有的例子和老API的代码,所以它们是无效的.现在,我明白了,使用新的API你必须在Google开发者控制台中创建一个项目…使用API2很简单它…

随机推荐

  1. 在airgapped(离线)CentOS 6系统上安装yum软件包

    我有一个CentOS6系统,出于安全考虑,它已经被空气泄漏.它可能从未连接到互联网,如果有,它很长时间没有更新.我想将所有.rpm软件包放在一个驱动器上,这样它们就可以脱机安装而无需查询互联网.但是,我在测试VM上遇到的问题是,即使指定了本地路径,yum仍然会挂起并尝试从在线存储库进行更新.另外,有没有办法使用yum-utils/yumdownloader轻松获取该包的所有依赖项和所有依赖项?目前

  2. centos – 命名在日志旋转后停止记录到rsyslog

    CentOS6.2,绑定9.7.3,rsyslog4.6.2我最近设置了一个服务器,我注意到在日志轮换后,named已停止记录到/var/log/messages.我认为这很奇怪,因为所有日志记录都是通过rsyslog进行的,并且named不会直接写入日志文件.这更奇怪,因为我在更新区域文件后命名了HUPed,但它仍然没有记录.在我停止并重新启动命名后,记录恢复.这里发生了什么?

  3. centos – 显示错误的磁盘大小

    对于其中一个磁盘,Df-h在我的服务器上显示错误的空白区域:Cpanel表明它只有34GB免费,但还有更多.几分钟前,我删除了超过80GB的日志文件.所以,我确信它完全错了.fdisk-l/dev/sda2也显示错误:如果没有格式化,我该怎么做才能解决这个问题?并且打开文件描述符就是它需要使用才能做到这一点.所以…使用“lsof”并查找已删除的文件.重新启动写入日志文件的服务,你很可能会看到空间可用.

  4. 如何在centos 6.9上安装docker-ce 17?

    我目前正在尝试在centOS6.9服务器上安装docker-ce17,但是,当运行yuminstalldocker-ce时,我收到以下错误:如果我用跳过的标志运行它我仍然得到相同的消息,有没有人知道这方面的方法?

  5. centos – 闲置工作站的异常负载平均值

    我有一个新的工作站,具有不寻常的高负载平均值.机器规格是:>至强cpu>256GB的RAM>4x512GBSSD连接到LSI2108RAID控制器我从livecd安装了CentOS6.564位,配置了分区,网络,用户/组,并安装了一些软件,如开发工具和MATLAB.在启动几分钟后,工作站负载平均值的值介于0.5到0.9之间.但它没有做任何事情.因此我无法理解为什么负载平均值如此之高.你能帮我诊断一下这个问题吗?

  6. centos – Cryptsetup luks – 检查内核是否支持aes-xts-plain64密码

    我在CentOS5上使用cryptsetupluks加密加密了一堆硬盘.一切都很好,直到我将系统升级到CentOS6.现在我再也无法安装磁盘了.使用我的关键短语装载:我收到此错误:在/var/log/messages中:有关如何装载的任何想法?找到解决方案问题是驱动器使用大约512个字符长的交互式关键短语加密.出于某种原因,CentOS6中的新内核模块在由旧版本创建时无法正确读取512个字符的加密密钥.似乎只会影响内核或cryptsetup的不同版本,因为在同一系统上创建和打开时,512字符的密钥将起作用

  7. centos – 大量ssh登录尝试

    22个我今天登录CentOS盒找到以下内容这是过去3天内的11次登录尝试.WTF?请注意,这是我从我的提供商处获得的全新IP,该盒子是全新的.我还没有发布任何关于此框的内容.为什么我会进行如此大量的登录尝试?是某种IP/端口扫描?基本上有4名匪徒,其中2名来自中国,1名来自香港,1名来自Verizon.这只发生在SSH上.HTTP上没有问题.我应该将罪魁祸首子网路由吗?你们有什么建议?

  8. centos – kswap使用100%的CPU,即使有100GB的RAM也可用

    >Linux内核是否应该足够智能,只需从内存中清除旧缓存页而不是启动kswap?

  9. centos – Azure将VM从A2 / 3调整为DS2 v2

    我正在尝试调整前一段时间创建的几个AzureVM,从基本的A3和标准A3到标准的DS2v2.我似乎没有能力调整到这个大小的VM.必须从头开始重建服务器会有点痛苦.如果它有所不同我在VM中运行CentOS,每个都有一个带有应用程序和操作系统的磁盘.任何人都可以告诉我是否可以在不删除磁盘的情况下删除VM,创建新VM然后将磁盘附加到新VM?

  10. centos – 广泛使用RAM时服务器计算速度减慢

    我在非常具体的情况下遇到服务器速度下降的问题.事实是:>1)我使用计算应用WRF>2)我使用双XeonE5-2620v3和128GBRAM(NUMA架构–可能与问题有关!

返回
顶部