Nginx/Apache+acme.sh实现https访问
1 概述
acme.sh实现了acme协议,可以从Let‘s Encrypt生成免费的ssl证书用于实现https,本文介绍了常见的两种服务器Apache与Nginx上利用acme.sh配置https服务。
约定:
APACHE_INSTALL_DIR --- Apache安装目录NGINX_INSTALL_DIR --- Nginx安装目录
www.test.com --- 测试域名,请按需要换成自己的域名
2 准备工作
- 一个域名
- 一台云服务器
2.1 域名与服务器
域名与服务器直接买就好了,笔者的都是在阿里云上买的。
2.2 域名解析
需要确保域名可以解析到对应的ip上面,一般的域名购买商会提供解析服务,按图形界面操作即可,以阿里云为例,选择域名进行解析:
主机记录填www,记录值填服务器公网ip.
间隔十分钟左右可以ping一下自己的域名,如果显示服务器ip则解析成功。
2.2 端口
服务器要开启80与443端口,80用于HTTP测试,443用于HTTPS访问。以阿里云为例:
3 Nginx
Nginx有两种安装方式,一种是仓库形式安装,另一种是从源码编译安装。
3.1 编译安装的Nginx(1.17.9)
3.1.1 安装Nginx
先去下载源码,上传到服务器,解压:
tar -zxvf nginx-1.17.9.tar.gzcd nginx-1.17.9
可以先使用
./configure --help
查看选项帮助,这里要注意一下pcre与openssl,是源码目录,不是安装目录,安装之后删了源码的,重新来这里下载pcre与这里下载openssl,注意一定需要http_ssl_module这个模块,不要漏了。
./configure --prefix=/xxxxx --with-pcre=/xxxxx --with-openssl=/xxxx --with-http_ssl_modulemake
sudo make install
好了之后进入安装目录下的sbin,启动服务。
cd NGINX_INSTALL_DIR/sin./nginx
然后可以在浏览器输入服务器公网ip测试一下:
3.1.2 证书处理
首先安装acme.sh
curl https://get.acme.sh | sh. ~/.bashrc
生成证书
acme.sh --issue -d www.test.com --webroot NGINX_INSTALL_DIR/html
webroot的话就直接使用Nginx的默认文档根目录。好了之后会看到这样的提示:
接着安装证书:
acme.sh --installcert -d www.test.com
--keypath /xxxx/xxx.key
--fullchainpath /xxx/xxx.pem
路径与名字随便,后缀不能变。
3.1.3 Nginx配置
修改Nginx配置文件:
cd NGINX_INSTALL_DIR/confcp nginx.conf nginx.conf.bak
vim nginx.conf
找到HTTPS server这一行,这里是96行,把从server开始到最后一个花括号的代码全部去掉注释。
然后修改这三行,server_name填域名,ssl_certificate填刚才的pem文件路径,ssl_certificate_key填刚才的key文件路径。路径建议绝对路径,可以不加双引号。
记得记得要加上一行ssl协议:
3.1.4 测试
可以先使用-t测试语法错误:
cd NGINX_INSTALL_DIR/sbin./nginx -t
ok的话,重启服务并输入域名测试:
cd NGINX_INSTALL_DIR/sbin./nginx -s stop
./nginx
成功!
3.2 从仓库安装Nginx(1.16.1)
3.2.1 安装Nginx
从仓库安装就简单多了,一行就可以了,系统Centos,其他自行搜索:
yum install nginx
可以先测试一下,直接用
nginx
开启服务,然后浏览器输入公网ip:
(笔者有点怀疑是不是装了个假的Nginx,两个的主页居然不一样。。。。)
3.2.2 证书处理
没安装acme.sh的先安装:
curl https://get.acme.sh | sh. ~/.bashrc
申请证书:
acme.sh --issue -d www.test.com --webroot /usr/share/nginx/html
安装证书:
acme.sh --installcert -d www.test.com
--keypath /xxxx/xxx.key
--fullchainpath /xxx/xxx.pem
3.2.3 Nginx配置
同样先备份:
cd /etc/nginxcp nginx.conf nginx.conf.bak
vim nginx.conf
这里的配置比编译安装的又多了不少,一样从server(61行)开始去掉注释:
然后修改三行:
server_name填域名,ssl_certificate填pem文件,ssl_certificate_key填key文件。
最后增加一行ssl协议:
3.2.4 测试
可以先用-t测试语法错误:
nginx -t
ok的话重启服务:
nginx -s stopnginx
浏览器输入域名访问:
4 Apache
Apache也有两种安装方式,从源码编译安装与从仓库安装。
4.1 编译安装的Apache(2.4.41)
4.1.1 安装Apache
编译安装Apache比较麻烦,需要安装pcre,apr,apr-util,生成Makefile时需要指定以下几个选项:
--with-apr --with-apr-util
--with-pcre
--enable-ssl
--with-ssl
具体可以看这里。
安装好了之后需要先确定ssl模块是否存在:
cd APACHE_INSTALL_DIR/modulesls | grep ssl
如果没有显示mod_ssl.so,则需要重新安装,确定生成Makefile时没有漏掉
--enable-ssl与
--with-ssl
如果有ssl模块,直接修改配置文件测试一下。
cd APACHE_INSTALL_DIR/confvim httpd.conf
修改ServerName为
localhost:80
启动服务输入localhost测试:
cd APACHE_INSTALL_DIR/bin./apachectl
页面只有一行It works!:
(话说这和仓库安装的Apache首页差距这么大。。。)
4.1.2 证书处理
没安装acme.sh的先安装:
curl https://get.acme.sh | sh. ~/.bashrc
申请证书:
acme.sh --issue -d www.test.com --webroot APACHE_INSTALL_DIR/htdocs
这里webroot为Apache默认的文档根目录.
安装证书:
acme.sh --installcert -d www.test.com --key-file /xxxx/xxx.key
--cert-file /xxxx/xxxx.crt
--fullchain-file /xxx/xxxfullchain.crt
路径与名字随便,后缀名不能变。
4.1.3 Apache配置
首先修改conf/httpd.conf:
cd APACHE_INSTALL_DIR/confcp httpd.conf httpd.conf.bak
vim httpd.conf
找到这三行,去掉注释。
然后修改httpd-ssl.conf:
cd extracp http-ssl.conf http-ssl.conf.bak
vim httpd-ssl.conf
DocumentRoot可以默认,ServerName改成
www.test.com:443
然后修改这三行,把证书的文件相应填入。
4.1.4 测试
语法检查:
cd APACHE_INSTALL_DIR/bin./apachectl -t
没有错误之后重启服务:
./apachectl stop./apachectl
浏览器输入域名访问:
4.2 从仓库安装的Apache(2.4.6)
4.2.1 安装Apache
yum install httpd
修改配置文件并进行测试:
cd /etc/httpd/confcp httpd.conf httpd.conf.bak
vim httpd.conf
找到ServerName改成
localhost:80
开启服务后输入localhost:80.
systemctl start httpd
另外要确保ssl模块存在:
cd /etc/httpd/modulesls | grep ssl
如果没有输出的话,证明没有ssl模块,需要安装:
yum install mod_ssl
再一次grep:
ls | grep ssl
4.2.2 证书处理
没安装acme.sh的先安装:
curl https://get.acme.sh | sh. ~/.bashrc
申请证书:
acme.sh --issue -d www.test.com --webroot /var/www/html
其中/var/www/html为Apache默认文档根目录。
安装证书:
acme.sh --installcert -d www.test.com --key-file /xxxx/xxx.key
--cert-file /xxxx/xxxx.crt
--fullchain-file /xxx/xxxfullchain.crt
4.2.3 Apache配置
修改ssl.conf:
cd /etc/httpd/conf.dcp ssl.conf ssl.conf.bak
vim ssl.conf
修改ServerName与DocumentRoot,ServerName填域名,DocumentRoot直接去掉注释。接着修改以下三行,根据刚才生成的三个文件对应填入即可。
4.2.4 测试
apachectl -t
没有语法错误就重启服务:
systemctl stop httpdsystemctl start httpd
浏览器输入访问:
5 总结
其实这里采用了比较麻烦的方式手动安装证书,acme.sh其实还有更简单的不需要webroot的命令:
acme.sh --issue -d www.test.com --apacheacme.sh --issue -d www.test.com --nginx
另外还可以通过手动dns的方式:
acme.sh --issue -d www.test.com --dns dns_xxx
这种方式可以利用域名解析商提供的api自动添加记录完成认证,可以参考这里。
另外文章没有说到证书过期更新的问题,可以看官方中文说明,这里。
除此之外还可以利用openssl使安全性的评分更高,测试网站这里,修改配置这里。
还有最后一个,现有云服务器厂商提供了免费的证书购买,如阿里云,可以直接购买免费证书然后利用文档安装到服务器上。
祝你们早日有一个属于自己的https的网站。
以上是 Nginx/Apache+acme.sh实现https访问 的全部内容, 来源链接: utcz.com/z/514462.html