-- windows服务器ssl与https的配置方案
【官网】:#
应用场景
通常对于web站点,为了提升安全,利于SEO排名等需求,需要部署ssl,实现https访问。基础资源
openssl,证书
使用须知
请评估自己产品或项目的实际需求,如果是网站类的还需要考虑老地址的兼容跳转访问,不能出现大量404之类的,那样会影响seo排名和用户体验。
配置步骤
>ssl证书与https的介绍.
>>ssl证书(https)主要起到作用:
1. )实现网站认证、内容加密传输和数据一致性。//例如防电信dns劫持,防止传输过程中暴露账号密码.
经CA签发的证书才起到认证可信的作用,所有有效证书均可以起到加密传输的作用.
[注1]仅能在传输过程中防止被篡改,无法做到不被抓包.
https抓包的原理就是抓包程序将服务器返回的证书截获 然后给客户端返回一个它自己的证书 客户端发送的数据抓包程序用自己的证书解密,然后再用截获的证书加密,再发给服务器 所以你在能看到明文。
密文是针对https两端以外其他路径而言,你作为https链接的两端,当然可以看到明文 .
技术一点来说,TLS协议是在tcp协议之上的,tcp又是基于IP协议的。所以无论如何,你的对端IP地址是肯定无法加密的。
>>应用场景.
一般会在比较敏感的部分页面采用https传输,比如注册、登录、控制台等。
[注1]内容加密传输更安全,如果只是为了加密,使用自签发的证书也可以,但浏览器无法验证证书,所以会给出一个非常吓人的警告,所以自签发证书不适合给外人使用,只适合内部使用,把这个证书 加入到自己的信任列表或忽略证书验证即可,以后就不会继续拦截了.
>>ssl证书对域名的生效类型.
作用范围 |
备注 |
单域名 |
只针对这个域名有效,不能用在其它域名下 |
多域名 |
只针对列出的多个域名有效 |
通配符域名 |
对任意子域名有小,显示的是 *.example.com |
[注]注意:SSL所说的单个域名是一个完整的域名,一个子域名就算一个,而非一个顶级域名。
如果网站有很多子域名,只需要申请真正需要的域名证书.
>>ssl证书验证对象类别.
作用对象 |
备注 |
域名认证(Domain Validation) |
扩展认证(Extended Validation,简称EV) |
组织机构认证(Organization Validation) |
认证的域名和公司信息,需要提交公司资料认证。 |
扩展认证(Extended Validation,简称EV) |
这种证书会在浏览器中出现“很明显”的绿色地址栏,给用户的可信度最高。有安全评估保证。 |
>>ssl证书的签发机构.
国外常见的SSL提供商有:Thawte,Go Daddy,VeriSign,RapidSSL,GeoTrust(QuickSSL),StartSSL,Comodo。
StartSSL、Go Daddy的比较便宜,GeoTrust、Comodo的价格适中,Thawte和VeriSign的价格较贵。
VeriSign现在归属赛门铁克,在国内是由天威诚信代理的。
>>免费的ssl.
阿里云免费Symantec ssl.
>>关于自签SSL证书相对权威CA的证书的区别.
区别1)不被浏览器支持,会提示风险.
区别2)无法吊销.
自签名的证书无法被吊销,CA签名的证书可以被吊销 能不能吊销证书的区别在于,如果你的私钥被黑客获取,如果证书不能被吊销,则黑客可以伪装成你与用户进行通信.
区别3)容易被伪造(如果核心功能依赖服务器还行,否则不安全).
自签SSL证书是可以随意签发的,不受任何监管,您可以自己签发,别人也可以自己签发。如果您的网站使用自签SSL证书,那黑客也可以伪造一张一模一样的自签证书,用在钓鱼网站上,伪造出有一样证书的假冒网银网站
>>部署须知.
注1).注意证书的保护.
证书签发给你后,最主要是保护好私钥证书,这个丢失或泄漏就完了。因为如果被别人利用也就毫无安全性了,需要向证书签发机构申请撤销证书并申请新的证书,这当然也是要收费的.
注2)证书并不是越贵越好.
ssl证书认证其实就是由可信源认证了一下,类似于办证,用起来没什么差别,并非越贵越好.
注3)ssl的弊端和推荐应用场景.
1.)ssl比http更加耗资源,主要是tcp连接和内容加密方面的开销, 因此理论上来说对重要的东西进行https化处理,对公开的文章内容就不需要了.
2.)只要你不能确保永远提供 HTTPS 服务,就不要启用。因为一旦 HSTS 生效,你再想把网站重定向为 HTTP,之前的老用户会被无限重定向,唯一的办法是换新域名.
注4)部署https的时候需要考虑以下问题.
4.1)如果直接由http切换到https:
老用户依然会使用http,因此需要在服务端做http重定向设置.
IIS7.5下载地址:
中文32位:http://download.microsoft.com/download/4/9/C/49CD28DB-4AA6-4A51-9437-AA001221F606/rewrite_x86_zh-CN.msi
中文64位:http://download.microsoft.com/download/4/E/7/4E7ECE9A-DF55-4F90-A354-B497072BDE0A/rewrite_x64_zh-CN.msi
英文:http://www.iis.net/downloads/microsoft/url-rewrite
IIS 8安装URL重写参考文献 http://shiyousan.com/post/635646254870261696
4.2)如果让页面同时支持http与https:容易造成有后面说的混合内容或混合脚本的问题.
混合内容是指:在https的页面中混合了非https的资源请求,比如图片、css、js 等等。如果是混合了非 https 的 js 代码,则被称为混合脚本。
混合内容的危害:如果只是混合了不安全的图片和css,那么受中间人攻击篡改,一般只会影响页面的显示,危害相对小一点。如果是混合了不安全的 js 代码,则这个不安全的 js 可以完全访问和修改页面中的任何内容,这是非常危险的.
所以,只有页面本身和所有引用的资源都是 https 的浏览器才认为是安全的,只要其中引用了非安全资源(即使图片),浏览器都会给出不安全的提示,特别是有 js 的情况。如果浏览器提示不安全,那样我们就达不到原来目的了。我们费了半天功夫去申请 SSL 证书,配置Web服务器,最后如果因为混合内容而前功尽弃就太糟了。咱继续努力吧,想办法让所有引用资源都是安全的.
4.3)引用第三方文件的问题(如 CDN 分发的文件).
一般我们会引用由 CDN 分发的文件,比如某个 js 库文件,而不用访问自己网站上的,这样借助 CDN 网络可以加快速度,这当然很好。但是,如果我们在页面中使用绝对 URL 直接引用这个文件就无法自动使用 https 了!出现了混合协议内容,浏览器又该“变脸”了.
4.4)js自动判断协议的问题.
其实 js 脚本可以这样:document.location.protocol 等于 ‘http:‘ 还是 ‘https:‘ 来判断。例如在 Google Analytics 的嵌入代码中:
ga.src = (‘https:‘ == document.location.protocol ? ‘https://ssl‘ : ‘http://www‘) + ‘.google-analytics.com/ga.js‘;
4.5)应用程序判断协议.
对于动态页面,如 jsp、php等,也是可以动态判断当前是否使用了 https 协议的。所以应用可以根据动态判断,来生成不同的引用 URL。这样虽然有点麻烦,但也算是解决了自动识别协议的问题,当然相对路径总是不需要处理的。
比如在 jsp 中:
request.isSecure() 为true 表示当前为 https ,false表示 http 访问
request.getScheme() 返回字符串 https 或 http
4.6)js与ajax同源策略.
http 和 https是不同源的!即使后面的内容都一样。所以 ajax 发请求的时候要使用正确协议的绝对URL才行。
相对URL的 ajax 请求没关系。
注5)自签发证书.
>关于ssl与https的部署,实施.
>>基于openssi对api站点实施自发证书及https方案.
>>>安装openssl.
//需要vc的运行环境.
安装openssl,安装有两种方式,第一种直接下载安装包,装上就可运行;第二种可以自己下载源码,自己编译。这里推荐第一种。
安装包:http://slproweb.com/products/Win32OpenSSL.html
选择: win64_openssl.v1.1.0f (33MB)
源码地址:https://github.com/openssl/openssl
>>>创建自签名证书.
[注]以管理员身份打开openssl\bin\openssl.exe
1.)创建私钥文件 config.key:
genrsa -out config.key 2048 //2048是秘钥长度,config是私钥文件名称.
2.)基于私钥文件创建自签名证书config.cert.
req -new -x509 -key config.key -out config.cer -days 3650 -subj /CN=www.config.net.cn
[注]
Country Name (2 letter code) [AU]:CN //国家简称
State or Province Name (full name) [Some-State]:GuangDong //州或省的名字
Locality Name (eg, city) []:ShenZhen //区或市县的名称
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Comapny //公司或组织名
Organizational Unit Name (eg, section) []:Mobile //单位或者是部门名称
Common Name (e.g. server FQDN or YOUR name) []:xxxxxx //域名或服务器名或IP
Email Address []:xxxxx@gmail.com //Email地址
<异常1>
Can’t open c:\Program Files\Common Files\SSL/openssl.cnf for reading,No such file or directory
解决办法:
步骤1)设置环境变量:
OPENSSL_CONF=D:\OpenSSL-Win64\bin\cnf\openssl.cnf
[注]实践发现需要使用bin\cnf\openssl.cnf,而不能使用bin\openssl.cnf
步骤2)重新以管理员权限打开一个新窗口.
3.)基于config.key及config.cert创建iis需要的config.pfx.
pkcs12 -export -out config.pfx -inkey config.key -in config.cer
[注]后面有输入密码的地方,主要是输入到iis导入证书时的界面.
>>>配置IIS站点.
[步骤1]点击iis根目录->点击[服务器证书].
[步骤2]
[步骤3]
[注1]http:80, https:443端口.
>>>客户端安装,使用证书进行访问.
<正常的http接口.抓包>
>>基于openssi对api站点实施自签名证书及https方案(且创建自己的证书颁发机构CA).
[注]主要是在遇到多个站点需要颁发证书时,提高效率.
[参考地址]http://www.cnblogs.com/walkerwang/p/4910799.html#ca
>关于ssl与https部署完成后,客户端的请求访问.
>>c#对https访问及验证证书的处理.
1. ///
2. ///回调验证证书问题
3. ///
4. public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
5. {
6. // 总是接受
7. //return true;
8. //如果需要验证,可以验证服务端证书的信息
9. 检查: certificate.Subject
10. 检查: certificate.Issuer //这里是证书的基本就信息
11. }
12.
13.
14. ///
15. /// 传入URL返回网页的html代码
16. ///
17. ///URL
18. ///
19. public string GetUrltoHtml(string Url)
20. {
21. StringBuilder content = new StringBuilder();
22.
23. try
24. {
25. //这一句一定要写在创建连接的前面。使用回调的方法进行证书验证。
26. ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
27.
28. // 与指定URL创建HTTP请求
29. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
30.
31. //创建证书文件
32. X509Certificate objx509 = new X509Certificate(Application.StartupPath + "\\123.cer");
33.
34. //添加到请求里
35. request.ClientCertificates.Add(objx509);
36.
37. // 获取对应HTTP请求的响应
38. HttpWebResponse response = (HttpWebResponse)request.GetResponse();
39. // 获取响应流
40. Stream responseStream = response.GetResponseStream();
41. // 对接响应流(以"GBK"字符集)
42. StreamReader sReader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
43. // 开始读取数据
44. Char[] sReaderBuffer = new Char[256];
45. int count = sReader.Read(sReaderBuffer, 0, 256);
46. while (count > 0)
47. {
48. String tempStr = new String(sReaderBuffer, 0, count);
49. content.Append(tempStr);
50. count = sReader.Read(sReaderBuffer, 0, 256);
51. }
52. // 读取结束
53. sReader.Close();
54. }
55. catch (Exception)
56. {
57. content = new StringBuilder("Runtime Error");
58. }
59.
60. return content.ToString();
61. }
ServicePointManager.ServerCertificateValidationCallback = CertificateValidationCallback;//Init时执行,用于注册方法。
public static bool CertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
Console.WriteLine(string.Format("Subject: {0}", certificate.Subject));
Console.WriteLine(string.Format("Issuer: {0}", certificate.Issuer));
return true;
}
常见问题
-
部署完ssl/https后依然能抓包
【解决方案】在传输的两端是没法避免的,只保护中间过程:https://www.pianyissl.com/support/page/43
快速入门
【免费SSL证书】
1) https://freessl.org/
https://freessl.cn/
相关博客:https://www.cnblogs.com/osnosn/p/10627969.html
2)https://ohttps.com/ (Let’s Encrypt)
支持自动续期.