zoukankan      html  css  js  c++  java
  • 服务器多站点多域名HTTPS实现

    假设有这样一个场景,我们有多个站点(例如site1.marei.com,site2.marei.com和site3.marei.com)绑定到同一个IP:PORT,并区分不同的主机头。我们为每一个SSL站点申请并安装了证书。在浏览网站时,用户仍看到证书不匹配的错误。

    1. IIS中实现

    • 问题原因

    当一个https的请求到达IIS服务器时,https请求为加密状态,需要拿到相应的服务器证书解密请求。由于每个站点对应的证书不同,服务器需要通过请求中不同的主机头来判断需要用哪个证书解密,然而主机头作为请求的一部分也被加密。最终IIS只好使用第一个绑定到该IP:PORT的站点证书解密请求,从而有可能造成对于其他站点的请求失败而报错。

    • 解决方案

      1. 第一种解决方案将每个https站点绑定到不同的端口。但是这样的话客户端浏览网页时必须手动指定端口,例如 https://site.domain.com:444
      2. 第二种解决方案是为每个站点分配一个独立的ip,这样冲突就解决了,甚至主机头也不用添加了。
      3. 第三种解决方案是使用通配证书。我们采用通配证书颁发给.domain.com,对于我们的示例中,应该采用颁发给.marei.com的证书,这样任何访问该domain的请求均可以通过该证书解密,证书匹配错误也就不复存在了。
      4. 第四种解决方案是升级为IIS8,IIS8中添加的对于SNI(Server Name Indication)的支持,服务器可以通请求中提取出相应的主机头从而找到相应的证书。

        SNI开启方式请参考http://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-server-name-indication-sni-ssl-scalability

    2. Nginx中实现

    打开 Nginx 安装目录下 conf 目录中打开 nginx.conf 文件,找到

    1. server {
    2. listen 443;
    3. server_name domain1;
    4. ssl on;
    5. ssl_certificate 磁盘目录/订单号1.pem;
    6. ssl_certificate_key 磁盘目录/订单号1.key;
    7. ssl_session_timeout 5m;
    8. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    9. ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
    10. ssl_prefer_server_ciphers on;
    11. location / {
    12. root html;
    13. index index.html index.htm;
    14. }
    15. }

    在上述基础上,再添加另一段配置

    1. server {
    2. listen 443;
    3. server_name dommain2;
    4. ssl on;
    5. ssl_certificate 磁盘目录/订单号2.pem;
    6. ssl_certificate_key 磁盘目录/订单号2.key;
    7. ssl_session_timeout 5m;
    8. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    9. ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
    10. ssl_prefer_server_ciphers on;
    11. location / {
    12. root html;
    13. index index.html index.htm;
    14. }
    15. }

    通过上述配置在Nginx中支持多个证书

    Apache配置HTTPS虚拟主机共享443端口

    1. Listen 443
    2. NameVirtualHost *:443
    3. <VirtualHost *:443>
    4. ……
    5. ServerName www.example1.com
    6. SSLCertificateFile common.crt;
    7. SSLCertificateKeyFile common.key;
    8. SSLCertificateChainFile ca.crt
    9. ……
    10. </VirtualHost>
    11. <VirtualHost *:443>
    12. ……
    13. ServerName www.example2.com
    14. SSLCertificateFile common2.crt;
    15. SSLCertificateKeyFile common2.key;
    16. SSLCertificateChainFile ca2.crt
    17. ……
    18. </VirtualHost>
  • 相关阅读:
    Java 异常处理
    Java Scanner 类
    Java 流(Stream)、文件(File)和IO
    Java 方法
    'javac' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
    Java 正则表达式
    nginx配置ssl证书
    Windows 查看端口、根据pid查找引用程序
    scp复制文件到另外一台服务器
    CentOS安装jdk SE 1.8 JDK与OpenJDK的区别
  • 原文地址:https://www.cnblogs.com/coce/p/7653258.html
Copyright © 2011-2022 走看看