🌀riba2534's Blog
凡事有交代,件件有着落,事事有回音
Ubuntu+Apache2配置腾讯云ssl证书实现https

Ubuntu+Apache2配置腾讯云ssl证书实现https

前言

本文所用的服务器环境是 Ubuntu18.04 + Apache2 .通过部署 ssl 来达到默认使用https方式访问网站的目的。

超文本传输安全协议(英语:Hypertext Transfer Protocol Secure缩写HTTPS,常称为HTTP over TLSHTTP over SSLHTTP Secure)是一种透过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在1994年首次提出,随后扩展到互联网上。

历史上,HTTPS连接经常用于万维网上的交易支付和企业信息系统中敏感信息的传输。在2000年代晚期和2010年代早期,HTTPS开始广泛使用于保护所有类型网站上的网页真实性,保护账户和保持用户通信,身份和网络浏览的私密性。

— 来自《维基百科》

其实可以解决很大部分的运营商劫持问题,比如别人打开你的网站,网页上面会出现一些广告之类的,所以需要配置 https 来防止这个问题。

正文

Ubuntu 下 LAMP 环境的搭建,就不细说了,主要讲一下如何配置证书。

申请证书

打开腾讯云https://buy.cloud.tencent.com/ssl来获得腾讯云提供的免费证书:

点击域名型免费版,然后进去填一下网址和邮箱即可申请到。

过了几分钟,就会受到一个邮件,是一个压缩包,里面有各种服务器的 ssl 证书文件,我们进入 Apache2 这个目录,然后发现里面有三个文件:

1
2
3
1_root_bundle.crt    # 证书文件
2_xxx.xxx.xxx.crt # 证书文件
3_xxx.xxx.xxx.key # 私钥文件
  • 1_root_bundle.crt包含一段代码-----BEGIN CERTIFICATE----------END CERTIFICATE-----
  • 2_xxx.xxx.xxx.crt文件包括一段证书代码-----BEGIN CERTIFICATE----------END CERTIFICATE-----
  • 3_xxx.xxx.xxx.key文件包括一段私钥代码-----BEGIN RSA PRIVATE KEY----------END RSA PRIVATE KEY-----

这是这几个文件的作用。

配置证书

在这里,我假设你已经会配置基本的/etc/apache2/sites-available/000-default.conf这个文件来达到已经可以通过 http 的方式来访问你的站点。

/etc/apache2这个目录下,有两个有关的目录sites-availablesites-enabled,我们进入sites-enabled目录下可以发现,里面有一个文件000-default.conf

1
lrwxrwxrwx 1 root root 35 Dec 28 15:24 000-default.conf -> ../sites-available/000-default.conf

实质上这个文件是/etc/apache2/sites-available/000-default.conf这个文件的软链接。

我们要配置另 ssl 证书,要依靠另一个文件,也就是default-ssl.conf,首先我们需要设置一个软链接,把这个文件链接到sites-enabled这个文件夹中:

1
ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/000-default-ssl.conf

然后去修改这个文件000-default-ssl.conf,因为已经做了软链接,其实这时候修改000-default-ssl.confdefault-ssl.conf都一样。

这个文件没有做任何修改前长这样子(去除自带的注释之后):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<IfModule mod_ssl.c>
	<VirtualHost _default_:443>
		ServerAdmin webmaster@localhost

		DocumentRoot /var/www/html

		ErrorLog ${APACHE_LOG_DIR}/error.log
		CustomLog ${APACHE_LOG_DIR}/access.log combined

		SSLEngine on

		SSLCertificateFile	/etc/ssl/certs/ssl-cert-snakeoil.pem
		SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
	
		<FilesMatch "\.(cgi|shtml|phtml|php)$">
				SSLOptions +StdEnvVars
		</FilesMatch>
		<Directory /usr/lib/cgi-bin>
				SSLOptions +StdEnvVars
		</Directory>

	</VirtualHost>
</IfModule>

然后把从腾讯云上面下载好的证书(3个文件)传到你自定义的目录中

然后我们需要修改一下,修改成这样:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<IfModule mod_ssl.c>
	<VirtualHost _default_:443>
		ServerAdmin 你的邮箱
        
		DocumentRoot /var/www/你的目录
	    ServerName 你的域名

		ErrorLog ${APACHE_LOG_DIR}/error.log
		CustomLog ${APACHE_LOG_DIR}/access.log combined

		SSLEngine on
		# 注意,需要添加这三行
		SSLCertificateFile 你自定义的路径/2_xxx.xxx.xxx.crt
    	SSLCertificateKeyFile 你自定义的路径/3_xxx.xxx.xxx.key
    	SSLCertificateChainFile 你自定义的路径/1_root_bundle.crt
	
		<FilesMatch "\.(cgi|shtml|phtml|php)$">
				SSLOptions +StdEnvVars
		</FilesMatch>
		<Directory /usr/lib/cgi-bin>
				SSLOptions +StdEnvVars
		</Directory>
	</VirtualHost>
</IfModule>

重要的三个参数的作用如下表:

配置文件参数 说明
SSLEngine on 启用 SSL 功能
SSLCertificateFile 证书文件
SSLCertificateKeyFile 私钥文件
SSLCertificateChainFile 证书链文件

改好之后保存。

然后这时,我们加载一下 Apache2 的 SSL 模块:

1
2
sudo a2enmod ssl   #加载模块
sudo service apache2 restart # 重启服务

这时,在浏览器输入https://你的域名应该已经可以通过 https 的方式来访问网站了,这时浏览器那里应该也已经有了一个绿色的小锁。

但是但是…..这还不够,因为我们如果不主动输入https://的话,直接输入域名,还是会直接跳转到 80 端口的普通的 http 方式访问,所以我们需要强制使用 https 来访问

强制使用https

我们只需要打开/etc/apache2/sites-available/000-default.conf这个文件,在你的 <VirtualHost*:80></VirtualHost>这个标签内随便一个地方加上三行:

RewriteEngine on
RewriteCond   %{HTTPS} !=on
RewriteRule   ^(.*)  https://%{SERVER_NAME}$1 [L,R]

然后保存,然后启动 Apache2 的重定向:

1
 sudo a2enmod rewrite

然后再重启 Apache2,至此大功告成:

1
sudo service apache2 restart

然后,打开浏览器直接输入域名,就会自动跳转到 https 的方式。

参考链接:


最后修改于 2018-12-28

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。