关于HTTPS的一些备忘

HTTPS连接的前几毫秒发生了什么:http://blog.jobbole.com/48369/

Server Name Indication:https://en.wikipedia.org/wiki/Server_Name_Indication

SNI: 实现多域名虚拟主机的SSL/TLS认证:http://www.ttlsa.com/web/sni-multi-domain-virtual-host-ssl-tls-authentication/

如何在 Chrome 地址栏快速显示 HTTPS 证书信息

原文:

http://www.appinn.com/how-to-display-https-certificates-in-chrome-address/

https://www.ghacks.net/2017/07/27/configure-google-chrome-to-display-certificates-directly/

 

针对 Chrome 60+ 的技巧:

1、在地址栏输入chrome://flags/#show-cert-link
2、点击第一行的 启用
3、重启浏览器

使用HE Tunnel通过ipv6无法进行https访问

在家里的Mikrotik路由器上使用HE的6to4 Tunnel服务实现了ipv6的接入,但是使用中发现一些网站http可以访问,但是https就无法访问,直接网页就打不开,竟然还包括我自己的网站。。。今天有时间在客户端和服务端同时抓了包,发现客户端的Client Hello正常收发(下图绿色),但是服务端的Server Hello正常发出了但客户端竟然没有收到(下图红色)。。。

第一反应想到的是伟大的长城,但是细想这个是ipv6,应该不受这个限制。HE应该也不会过滤这些消息。突然想到的MTU,搜索了一下,竟然有相同问题(https://forums.he.net/index.php?topic=3545.0),原因就是MTU设置导致的。

找到原因就简单了,打开https://tunnelbroker.net/,在对应的Tunnel管理界面的“Example Configurations“界面看到Mikrotik给出的配置MTU是1280,我看了下我的路由器也确实是1280。又到Tunnel管理界面的“Advanced“界面看了下,原来默认是1480,需要自己改成1280,并且Update!

 

 

 

之后再到自己的路由器上断开重新连接,问题解决~~!

 

如何在Nginx中搭建HTTPS站点

这里采取的是在StartSSL申请免费证书,使用Nginx + php-cgi(php-fpm)的方式建立HTTPS加密的站点。

首先在StartSSL注册,点左上角图标“Sign-up For Free”,注册的过程要填写比较详细的地址、电话什么的,否则可能被拒,具体注册教程可以Google一下,很多介绍,也很简单。注册过程要验证邮件地址,注册成功之后会自动安装一个StartCom Free Certificate Member的证书,这个就是用来登录的,搞证书的完整登录用证书也算是门当户对。必须用IE浏览器注册,因为要装ActiveX控件。


注册之后,点击Authenticate,再进入Control Panel,  先使用Validations Wizard验证域名,再使用Certificates Wizard创建证书,类型为“Web Server SSL /TLS Certificate”。在接下来的步骤里面,可以在线创建私钥,但我发现在网站上直接输入密码,提交会有一个JavaScript错误,导致无法继续,换了浏览器和机器也是一样。

所以我们可以选择创建私钥的步骤Skip,然后把自己采用自己创建的CSR用用本工具打开,粘贴到下一步“Submit Certificate Request (CSR)”的文本框中;下面用到的openssl是OpenSSL库里面的一个工具。
1)创建一个4096长度的私钥
openssl genrsa -des3 -out server.key 4096

2)创建一个CSR (Certificate Signing Request)
openssl req -new -key server.key -out server.csr
其中challenge password为空

这样就可以得到一个CRT证书文件,将其从页面中粘贴到本地一个文本文件,并改名为CRT后缀即可。今后要可以在Control Panel -> Tool Box ->Retrieve Certificate重新获得。


Nginx配置很简单,最重要的配置红色标识。一些PHP程序可能会使用_SERVER["HTTPS"]参数来判断当前是HTTPS还是HTTP,这个会影响程序生成的一些链接的前缀,如果检测不正确,可能会导致访问HTTPS站点时候,浏览器提示“本页不但包含安全的内容,也包含不安全的内容。是否显示不安全的内容”,而由于是采用反向代理的方式,透过Nginx访问php-cgi,而php-cgi不是以HTTPS方式运行的,所以必须要显示的制定生成参数fastcgi_param HTTPS on; 

server
{
    listen a.b.c.d:443;

    access_log /xxx/ssl.access.log main;
    error_log  /xxx/ssl.error.log;


    root /xxx/;
    index index.php index.html index.htm;


    ssl on;
    ssl_certificate /xxx/server.crt;
    ssl_certificate_key /xxx/server.key;

    ssl_session_timeout 5m;
    ssl_protocols SSLv2 SSLv3 TLSv1;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers on;


    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        fastcgi_param HTTPS on; 
        include fastcgi_params;
    }


    location ~ /\.ht {
        deny all;
    }

}


启动试一试应该就可以了,但每次启动Nginx的时候都会提示输入私钥密码,这个可以这样解决:
1) 去除密码
openssl rsa -in server.key -out server.nopass.key

2)把Nginx的配置替换为
ssl_certificate_key /xxx/server.nopass.key;即可


经过测试,在IE 7.0.5730.11、Chrome 4.1.249.1064版本中使用正常;在Firefox 3.5.3会提示“此连接是不受信任的”,这是因为StartSSL的根证书还没有被FF认可,只是被M$和Google认可,添加个例外就可以继续访问了,加密功能是一样的,不过变得和自己的做的证书一样了。免费的不求太完美,将就用。