自己制作免费的HTTPS证书
日期:2018-12-10
来源:程序思维浏览:1736次
Certbot
Certbot是Let’s Encrypt推出的获取证书的客户端,可以让我们免费快速地获取Let’s Encrypt证书。
开始部署
安装Certbot
进入Certbot的官网https://certbot.eff.org/,选择你所使用的软件和系统环境,然后就会跳转到对应版本的安装方法,以Ubuntu + Nginx为例。
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot
获取证书
安装完成后执行:
certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com
这条命令的意思是为以/var/www/example为根目录的两个域名example.com和www.example.com申请证书。
如果你的网站没有根目录或者是你不知道你的网站根目录在哪里,可以通过下面的语句来实现:
certbot certonly --standalone -d example.com -d www.example.com
使用这个语句时Certbot会自动启用网站的443端口来进行验证,如果你有某些服务占用了443端口,就必须先停止这些服务,然后再用这种方式申请证书。
证书申请完之后,Certbot会告诉你证书所在的目录,一般来说会在/etc/letsencrypt/live/这个目录下。
配置Nginx启动HTTPS
找到网站的Nginx配置文件,找到listen 80;,修改为listen 443;在这一行的下面添加以下内容:
ssl on;
ssl_certificate XXX/fullchain.pem; # 修改为fullchain.pem所在的路径
ssl_certificate_key XXX/privkey.pem; # 修改为privkey.pem所在的路径
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
保存退出后,通过nginx -t来检查配置文件是否正确,有错误的话改之即可。配置文件检测正确之后,通过nginx -s reload来重载配置文件。
然后通过访问https://example.com来查看是否配置成功。
如果发现无法访问或者是加载不出来的话检查一下443端口有没有开启!
设置HTTP强制跳转HTTPS
上一步成功之后大家可能会发现通过原来的http://example.com无法访问网页了,因为HTTP默认走的是80端口,我们刚才将其修改为443端口了。在这里我们可以在配置文件的最后一行加入以下代码:
server {
listen 80;
server_name example.com; # 这里修改为网站域名
rewrite ^(.*)$ https://$host$1 permanent;
}
意思是每一个通过80端口访问的请求都会强制跳转到443端口,这样一来访问http://example.com的时候就会自动跳转到https://example.com了。
设置证书自动续期
有心的小伙伴可能会留意到我们刚才申请的整数的有效期只有90天,不是很长,可是我们可以通过Linux自带的cron来实现自动续期,这样就相当于永久了。
开始部署
随便找一个目录,新建一个文件,名字随便起,在这里以example为例,在里面写入0 */12 * * * certbot renew --quiet --renew-hook "/etc/init.d/nginx reload",保存。
然后在控制台里执行crontab example一切都OK了。原理是example里存入了一个每天检查更新两次的命令,这个命令会自动续期服务器里存在的来自Certbot的SSL证书。然后把example里存在的命令导入进Certbot的定时程序里。
手动续期:$ sudo certbot renew --dry-run
附:
Nginx相关命令:
nginx -t # 验证配置是否正确
nginx -v # 查看Nginx的版本号
service nginx start # 启动Nginx
nginx -s stop # 快速停止或关闭Nginx
nginx -s quit # 正常停止或关闭Nginx
nginx -s reload # 重新载入配置文件
crontab相关命令:
cat /var/log/cron # 查看crontab日志
crontab -l # 查看crontab列表
crontab -e # 编辑crontab列表
systemctl status crond.service # 查看crontab服务状态
systemctl restart crond.service # 重启crontab
apache配置https证书
目的:在阿里云ESC的apache服务器上部署申请的证书实现HTTPS访问
步骤:
1,申请证书(为阿里云自动配发的证书)
2,在apache上部署
2.1,vim /usr/local/apache/conf/httpd.conf
查看模块项是否有并将其前面的#去掉
# LoadModule ssl_module modules/mod_ssl.so 改为
LoadModule ssl_module modules/mod_ssl.so
将# Secure (SSL/TLS) connections #Include conf/extra/httpd-ssl.conf
改为
# Secure (SSL/TLS) connections Include conf/extra/httpd-ssl.conf
2.2,vim /usr/local/apache/conf/extra/httpd-ssl.conf
增加如下项:
SSLHonorCipherOrder on
#<VirtualHost _default_:443> <VirtualHost wxjy.peigubao.com:443> # General setup for the virtual host DocumentRoot "/data/www/default" ServerName wxjy.aaa.com #ServerName localhost:443 #ServerAdmin you@example.com
ErrorLog "/usr/local/apache/logs/error_ssl_log" TransferLog "/usr/local/apache/logs/access_ssl_log" # SSL Engine Switch: # Enable/Disable SSL for this virtual host.
SSLEngine on #添加SSL 协议支持协议,去掉不安全的协议 SSLProtocol -all +TLSv1 +TLSv1.1 +TLSv1.2
# 修改加密套件如下 #SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4 #SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GC$ # 证书公钥配置 SSLCertificateFile /usr/local/apache/cert/public.pem # 证书私钥配置 SSLCertificateKeyFile /usr/local/apache/cert/213997737720084.key # 证书链配置,如果该属性开头有 '#'字符,请删除掉 SSLCertificateChainFile /usr/local/apache/cert/chain.pem </VirtualHost>
2.3, /usr/local/apache/bin/httpd -k restart
3,由于我这版本是apache2.4.10+openssl0.9.8,重启时报错提示协议TLSv1.1 TSLv1.2为非法协议
解决办法
3.1,升级openssl0.9.8到openssl1.0.1g
步骤:
3.2,之后配置
SSLProtocol -all +TLSv1 +TLSv1.1 +TLSv1.2
依然报警协议为非法
项目域名只支持了TLSv1但是是始终不支持TLSv1.1和TLSv1.2,对苹果测试不通过
报警
苹果测试
3.3,在这纠结很久,后问了下项目维护的运维兄弟,他找了个办法解决了问题,再次十分感谢
如下:
对apache2的模块如果动态编译通常可以使用 /path/apxs -c *.c来完成 但对 mod_ssl编译是会有一些问题 如: 出现 Unrecognized SSL Toolkit! 是由于 HAVE_OPENSSL这个没有define 需要增加 -DHAVE_OPENSSL undefined symbol: ssl_cmd_SSLMutex 或 undefined symbol: X509_free 通产是由于静态连接了 openssl的库照成的(默认)。 需要使用 -lcrypto -lssl -ldl 命令如下:
使用 whereis openssl 命令获取lib和include的路径
然后在apache 源码的modules/ssl文件夹下使用命令
/PATH/apxs -I/PATH/openssl/include -L/PATH/openssl/lib -c *.c -lcrypto -lssl -ldl
如下
/usr/local/apache/bin/apxs -i -a -D HAVE_OPENSSL=1 -I/usr/include/openssl/ -L/usr/local/ssl/lib/ -c *.c -lcrypto -lssl -ldl
openssl 编译的时候需要增加 shared参数
在次重启
/usr/local/apache/bin/httpd -k restart
没有报错
精品好课