window服务器ssl与https的配置方案

-- 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.)sslhttp更加耗资源,主要是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的资源请求,比如图片、cssjs 等等。如果是混合了非 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)应用程序判断协议.

对于动态页面,如 jspphp等,也是可以动态判断当前是否使用了 https 协议的。所以应用可以根据动态判断,来生成不同的引用 URL。这样虽然有点麻烦,但也算是解决了自动识别协议的问题,当然相对路径总是不需要处理的。

比如在 jsp 中:

request.isSecure() true 表示当前为 https false表示 http 访问

request.getScheme() 返回字符串 https http

4.6)jsajax同源策略.

http https是不同源的!即使后面的内容都一样。所以 ajax 发请求的时候要使用正确协议的绝对URL才行。

相对URLajax 请求没关系。

5)自签发证书.



>关于sslhttps的部署,实施.

>>基于openssiapi站点实施自证书及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.keyconfig.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


>关于sslhttps部署完成后,客户端的请求访问.

>>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)   

    支持自动续期.


    

参考资料