首页 > 清河洛 > 全站实现https化
2019
02-21

全站实现https化

一、申请SSL证书,证书有免费和收费区分,收费的支持泛解析,一般个人站长免费的就足够了,以腾讯云为例,网址https://buy.cloud.tencent.com/ssl申请域名证书,填写信息并等待验证之后就可以下载免费证书了。

二、把下载的域名证书解压并上传到服务器。

三、配置服务器,不同的web服务器配置方法有所差别

apache服务器:

首先添加监听443端口的网站配置:

Listen 443
<VirtualHost *:443>
    DocumentRoot "/wwwroot/www"
    ServerName www.domain.com
    ServerAlias domain.com
    SSLEngine on
    SSLProtocol TLSv1 TLSv1.1 TLSv1.2 #只允许使用TLS 
    #SSLProtocol all -SSLv2 -SSLv3 允许除SSLv2和SSLv3之外的所有
    SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5 #加密套件 
    SSLCertificateFile "/crt文件路径/2_domain.crt"
    SSLCertificateKeyFile "/key文件路径/3_domain.key"
    SSLCertificateChainFile "/crt文件路径/1_root_bundle.crt"
<Directory "/wwwroot/www">
      Options +Indexes +FollowSymLinks +ExecCGI
      AllowOverride All
      Order allow,deny
      Allow from all
      Require all granted
  </Directory>
</VirtualHost>

PS:SSLv2是不安全的,我们需要禁用它。SSLv3会受到卷毛狗漏洞(POODLE)的攻击,TLS 1.0在遭受到降级攻击时,会允许攻击者强制连接使用SSLv3,所以也需要禁用SSLv3。Google提出了一个名为TLSFALLBACKSCSV 的SSL/TLS扩展,它用于防止强制 SSL 降级,自OpenSSL 0.9.8版本之后会自动启用。

PS:加密套件的顺序是非常重要的,因为其决定了优先选择哪个算法。如果OpenSSL 版本比较旧,不可用的加密算法会自动丢弃,已经被强制丢弃的加密算法:

    aNULL 包含了非验证的 Diffie-Hellman 密钥交换,这会受到中间人(MITM)攻击
    eNULL 包含了无加密的算法(明文)
    EXPORT 是老旧的弱加密算法,是被美国法律标示为可出口的
    RC4 包含的加密算法使用了已弃用的 ARCFOUR 算法
    DES 包含的加密算法使用了弃用的数据加密标准(DES)
    SSLv2 包含了定义在旧版本 SSL 标准中的所有算法,现已弃用
    MD5 包含了使用已弃用的 MD5 作为哈希算法的所有算法

然后在.htaccess文件中添加全站301跳转:

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.domain.com/$1 [R=301,L]
#RewriteCond %{SERVER_PORT} !^443$
#RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} ^domain.com [NC]
RewriteRule ^(.*)$ https://www.domain.com/$1 [L,R=301]

最后重启apache服务即可。

nginx服务器:

在网站配置文件中添加监听443端口的网站:

listen 443 ssl;
#ssl on; 上句中listen 443后面添加了ssl已经代表ssl开启,这也是官方推荐写法
ssl_certificate /路径/xxxxxxxx.pem;
ssl_certificate_key /路径/xxxxxxxx.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:10m;
if ($server_port = 80){
    return 301 https://$server_name$request_uri;
}
if ($scheme = http) {
    return 301 https://$server_name$request_uri;
}
error_page 497 https://$server_name$request_uri;

最后重启nginx服务器。

PS:更安全的SSL服务器配置请点击查看Mozilla SSL配置生成器

PS:javascript也可以实现全站http跳转到https

方法一:
var targetProtocol = "https:";
if (window.location.protocol != targetProtocol){
    window.location.href = targetProtocol + window.location.href.substring(window.location.protocol.length);
}

方法二:
var url = window.location.href;
if (url.indexOf("https") < 0) {
    url = url.replace("http:", "https:");
    window.location.replace(url);
}
最后编辑:
作者:qingheluo
这个作者貌似有点懒,什么都没有留下。