草庐IT

前后端分离项目,开发和部署时,开启https访问的整体思路(详细步骤)

weixin_35676679 2023-09-29 原文

        所谓难者不会,会者不难。在问题解决之后,发现很简单,但在茫无头绪之初,往往不知该从何着手,查网上资料,大多仅是实现方案的一个片段,无法贯穿整个解决方案,下面简要介绍整个解决过程。先从理论上理清。

一、开启https认证需要有CA证书,先来了解一下https认证的过程,https认证有单相认证和双向认证,如果项目没有特定要求,一般来说单向认证就可以。认证过程如下:

 

 

 二、了解一下这些证书

 SSL 证书格式有PEM、CER、JKS、PKCS12等类型。下面逐一说明。

        1、DER .CER,文件是二进制格式,只保存证书,不保存私钥。

        2、PEM,一般是文本格式,可保存证书,可保存私钥。有时我们也把PEM 格式的私钥的后缀改为 .key。这种格式常用于 Apache 和 Nginx 服务器。

        3、CRT,可以是二进制格式,可以是文本格式,与 .DER 格式相同,不保存私钥。

        4、PFX,二进制格式,同时包含证书和私钥,一般有密码保护。从阿里云申请的CA证书的tomcat证书就是这种格式。用来部署在项目中,如ssm项目,springboot项目。

        5、JKS,Java Key Storage,二进制格式,同时包含证书和私钥,一般有密码保护。利用 JAVA 的一个叫 keytool 的工具,可以自已生成私有证书。一般用于 Tomcat 服务器。

 三、CA证书的获取

        CA证书可以用JAVA 的工具 keytool 自已生成(生成方式网上介绍很多,请自行查阅资料),也可以从阿里云或腾讯云平台免费申请,下面以阿里云为例介绍。

        在阿里云平台申请免费CA证书后,如下:

点击下载 按钮后的页面如下:

看到这么多证书,可能会晕,不知该下载那一个。 下面就介绍一下这些证书都是什么。分两种情况举例说明:

1、如果,是ssm的java项目,也就是前后端没有分离,项目部署在tomcat下就可以运行,那么,在这里只需要下载tomcat证书,然后在tomcat的配置文件server.xml中加入:

  <Connector port="8443" protocol="HTTP/1.1" maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
    keystoreFile="证书的路径 / 证书文件.pfx"    #这里我用的是绝对路径
    keystoreType="PKCS12"
    keystorePass="证书密码"
    clientAuth="false"
    sslProtocol="TLSv1+TLSv1.1+TLSv1.2" />

这样,就在8443端口,开启了https访问。

2、如果,是springboot + vue项目或者springboot+ uni-app项目,也就是前后端分离的项目,那就需要下载tomcat证书和前端容器需要的CA证书。如果前端是h5网页形式,一般是用nginx部署,那么就需要下载nginx的CA证书,证书分为两个文件,一个是以.key为扩展名,保存私钥;一个是以.pem为扩展名,保存证书(公钥)。

首先,先部署springboot部分。将下载的tomcat证书XXX.pfx文件,放到resources目录下面,也就是和application.yml文件同一目录,然后修改.yml配置文件如下:

server:
  port: 5443  # https的端口
  http:
    port: 5050  # http的端口

  ssl:
    key-store: classpath:XXXX.pfx    #类路径下的CA证书
    key-store-password: 证书密码     #证书密码
 然后新建配置类TomcatConfig,代码如下:
package com.xxx.common.config;

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.annotation.Value;



@Configuration
public class TomcatConfig {

    @Value("${server.http.port}")
    private int httpPort;

    @Value("${server.port}")
    private int httpsPort;

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

    @Bean
    public Connector connector(){
        Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        //http端口
        connector.setPort(httpPort);
        connector.setSecure(true);
        // https端口,即server.port
        connector.setRedirectPort(httpsPort); //重定向到htts
        return connector;
    }
}

然后测试是否开通https,如下:

说明 springboot部分开通https成功。这里,前端项目https可以通过发送请求。如uni-app项目,在manifest.json文件中如下所示:

 以上,在开发环境中,已经可以在前后端用https协议请求和返回数据。

3、接下来解决前端h5网页通过nginx部署时,CA证书配置问题

修改nginx配置文件nginx.conf,如下:

server {
        listen        443 ssl;
        server_name  你的域名;

        ssl_certificate      ../阿里云下载的nginx证书文件.pem;
        ssl_certificate_key  ../阿里云下载的nginx证书文件.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;


	location / {
		root   C:/project/xxx-uniapp/unpackage/dist/build/h5; #前端H5网页目录
		index  index.html index.htm;
		}
			
	location /proxyApi/ { #前端H5网页访问后台服务器的代理路径,在manifest.json配置的
		proxy_pass   https://127.0.0.1:5443/;
		proxy_set_header  Host $host:$server_port; 
	}

	

	location /aabbbccc {   #通过443端口访问的其它项目,如果没有这一段可以省去
		proxy_pass https://127.0.0.1:8443/aabbbccc;
		proxy_redirect off;
		proxy_set_header Host $host;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-Proto $scheme;  # 配置 X-Forwarded-Proto 就是为了正确地识别实际用户发出的协议是 http 还是 https。
 
	}
       
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
       
    }

至此,整个项目的https访问配置完成。

 四、补充说明

        在网上申请的CA证书,是需要绑定域名的。当在本机测试https访问时会有“证书风险”或者“不安全”等提示,但不影响访问和数据交互。在windows环境下开发,也可以用修改hosts文件的方法解决这个问题,这个文件的路径如下:C:\Windows\System32\drivers\etc

在hosts这个文件中加入一行:

         127.0.0.1   你的CA证书绑定的域名

这样,在本机浏览器访问【你的CA证书绑定的域名】时,实际上是访问的本机 127.0.0.1,这时的证书与域名匹配,浏览器就不再提示风险或不安全等信息。

整个解决思路完成,希望能够对在路上摸索的同学们有所启发。

有关前后端分离项目,开发和部署时,开启https访问的整体思路(详细步骤)的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  3. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  4. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  5. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  6. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  7. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  8. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  9. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  10. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

随机推荐