栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

关于使用SSL证书

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于使用SSL证书

SSL证书的使用
  • 证书的申请
  • 使用
    • tomcat中的使用
      • Springboot内置tomcat的使用
    • Nginx中的使用
    • demo

证书的申请

这里以阿里云为例
阿里云盾



根据系统下载合适的就可以了

使用

·

tomcat中的使用


首先进入tomcat根目录,然后创建文件夹cert将刚才下载的两个文件导入进去
接着我们移动到配置文件
tomcat安装目录下执行

 nano ./conf/server.xml

方式一:
找到配置端口号的标签,将默认配置注销掉
修改配置为


方式二:


可选:配置web.xml文件,开启HTTP强制跳转HTTPS。
在文件后添加以下内容:

  
      
    CLIENT-CERT  
    Client Cert Users-only Area  
  
  
      
      
        SSL  
        
    @Bean
    public EmbeddedServletContainerFactory servletContainer(){
        TomcatEmbeddedServletContainerFactory tomcat=new TomcatEmbeddedServletContainerFactory(){
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint=new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");//confidential
                SecurityCollection collection=new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(httpConnector());
        return tomcat;
    }

    @Bean
    public Connector httpConnector(){
        Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(8443);
        return connector;
    }

}

此处 是1.x的解决办法2.x版本中省去了postProcessContext方法的实现

@Bean
    public TomcatServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint constraint = new SecurityConstraint();
                constraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                constraint.addCollection(collection);
                context.addConstraint(constraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(httpConnector());
        return tomcat;
    }

    @Bean
    public Connector httpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        //Connector监听的http的端口号
        connector.setPort(80);
        connector.setSecure(false);
        //监听到http的端口号后转向到的https的端口号
        connector.setRedirectPort(443);
        return connector;
    }

此处来源:https://blog.csdn.net/qq_41170102/article/details/105837477

然后此时项目就可以通过[https://域名] | [https://域名:端口] 访问了

Nginx中的使用

依然是刚才的位置,这次我们下载nginx版的证书

接着我们把他移动到我们服务器专门用来放证书的位置(大家视情况而定),

这里由于我是使用的docker安装ngixn,所以我移动到了之前挂载到docker的一个目录在里面新建了以恶搞cert目录用以存放证书,把容器看作是另一个系统,不挂载过去是无法访问的;


容器里成功看到文件目录,挂载成功

然后回到我们挂载的目录。编辑配置文件。找到http片段(或者新建一个文件夹编辑server然后进行导入)

yourdomain.com:替换成证书绑定的域名。
如果您购买的是单域名证书,需要修改为单域名(例如www.aliyundoc.com);如果您购买的是通配符域名证书,则需要修改为通配符域名(例如*.aliyundoc.com)。

使用docker时千万注意证书路径的填写,需要填写的是容器内部的地址

#以下属性中,以ssl开头的属性表示与证书配置有关。
server {
    listen 443 ssl;
    #配置HTTPS的默认访问端口为443。
    #如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
    #如果您使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。
    server_name yourdomain.com; #需要将yourdomain.com替换成证书绑定的域名。
    root html;
    index index.html index.htm;
    ssl_certificate cert/cert-file-name.pem;  #需要将cert-file-name.pem替换成已上传的证书文件的名称。
    ssl_certificate_key cert/cert-file-name.key; #需要将cert-file-name.key替换成已上传的证书私钥文件的名称。
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    #表示使用的加密套件的类型。
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #表示使用的TLS协议的类型。
    ssl_prefer_server_ciphers on;
    location / {
        root html;  #站点目录。
        index index.html index.htm;
    }
}

配置好以后

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name cctv.cn www.cctv.cn;
    root html;
    index index.html index.htm;
    #证书地址这里有个坑,记住他是以ngin根目录为基准的相对路径,由于这里我挂载了conf.d所以文件在conf.d的cert中,所以配置如下
    ssl_certificate conf.d/cert/67_cctv.cn.pem;#这里是证书
    ssl_certificate_key conf.d/cert/67_cctv.cn.key;#这里是证书
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    location / {
    #注意ip地址,宿主机和容器相当于内网,所以内网ip和公网ip都可以,不能是回环地址
        proxy_pass http://47.243.67.238:8080;
        proxy_http_version 1.1;
        #下面就是做转发前的端口ip记录配置了
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_cache_bypass $http_upgrade;
    }
}
server{
监听80端口所有cctv.cn域名来的请求转发到https;
           listen 80;
           server_name cctv.cn;
           location / {
           return 302 https://$server_name$request_uri;
           }

}
server{
#这里是80端口的api服务
          listen 80;
           server_name api.xxx.cn;
           location / {
           proxy_pass http://47.23.167.238:10080;
           }
}

demo
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name xxx.cn www.xxx.cn;
    root html;
    index index.html index.htm;
    ssl_certificate conf.d/cert/667a07_xxx.cn.pem;
    ssl_certificate_key conf.d/cert/66a507_xxx.cn.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    location / {
        proxy_pass http://47.22.167.238:19527;
        #使用frps转发的时候不要设置下面这些,也不知道为啥。会404,先设置把。琢磨清楚了再回来改;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_cache_bypass $http_upgrade;
    }
}
server{
           listen 80;
           server_name xxx.cn;
           location / {
           return 302 https://$server_name$request_uri;
           }

}
#这里发现80就能正常转发,但是加上上面的哪些设置请求头frps就会报错,就是没有页面的那个错
server{
          listen 80;
           server_name api.xxx.cn;
           location / {
           proxy_pass http://47.22.167.238:19527;
           }
}

排除法嘛:
使用树莓派代挂公网服务器VP;
域名挂vp服务器,映射关系:访问vp的已配置映射端口时,就会转发到映射的内网机上
web:树莓派19527-vp19527
内网:19527 √
http:域名:19527 X(因为没配置策略?)
http:api域名 √ (80端口可以正常检测域名并转发)
https:域名 X (443转发策略是没问题的,可是出现了frp找不到页面的报错[也算是证明了转发起效了])
公网ip:19527 √
推断问题出在域名的转发上面;
把原先可以访问的api域名改成443的配置,发现api也不能访问了,推断后面哪些设定请求头的操作造成了frps的异常,删除443端口根据域名转发下的设置请求头操作,成功访问

有没有大佬知道是为什么呢,,求教求教

脑子一团乱:
回忆:
一个请求究竟是https并不取决于这个服务本身的配置,服务本身不用管自己要不要ssl,
emmmmm…再想想…
取决于最终配置ssl的nginx怎么配置转发规则,,
也就是向访问者提供访问路径,并非服务决定,,而是nginx决定的,,,是这样吧。。。。。。

服务只是创建了一个接口,
用户也只是告诉nginx他想访问什么,
nginx再根据配置好的策略进行匹配,
通过访问的特征数据进行转发比如域名,URI

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/602681.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号