拓冰建站拓冰建站
首页 / 资讯中心 / 正文

SpringBoot+Vue前后端分离项目HTTPS部署全攻略:从证书申请到Nginx配置

1. 项目概述为什么前后端分离项目必须上HTTPS最近在部署一个SpringBootVue的前后端分离项目时客户明确要求所有接口必须走HTTPS。这已经不是第一次遇到这种需求了现在但凡涉及到用户登录、数据传输或者线上正式环境HTTPS几乎成了标配。很多刚接触部署的朋友可能会觉得不就是把HTTP换成HTTPS吗在Nginx里配一下证书不就行了但实际操作起来从证书申请、后端配置、前端适配到Nginx代理每一步都有不少细节需要注意否则很容易出现跨域、证书无效、混合内容警告等问题。简单来说我们这个项目的目标很明确将一个标准的SpringBoot后端API服务和独立部署的Vue前端应用通过Nginx整合并配置有效的SSL证书实现全站HTTPS安全访问。这不仅仅是改个协议那么简单它涉及到前后端通信方式的改变、安全策略的调整以及生产环境部署的规范性。无论是使用免费的Let‘s Encrypt证书还是购买商业证书其核心流程和遇到的坑都大同小异。接下来我就结合最近一次从HTTP迁移到HTTPS的完整过程把其中的关键步骤、配置细节和避坑经验详细拆解一遍。2. 核心原理与方案选型2.1 HTTP与HTTPS的本质区别及为何要升级在动手之前我们得先搞清楚为什么要折腾。HTTP协议是明文的数据在传输过程中就像寄送一张没有信封的明信片途径的任何路由节点比如运营商、公共Wi-Fi都能看到上面的内容。这对于传输用户名、密码、身份证号等敏感信息来说是极其危险的。HTTPS则是在HTTP之下加入了一个安全层SSL/TLS协议。你可以把它理解为给明信片加了一个只有收件人才能打开的密码锁信封。这个“加锁”和“解锁”的过程依赖于SSL证书。证书里包含了服务器的公钥并由受信任的证书颁发机构CA进行数字签名确保客户端访问的“www.yourdomain.com”就是真正的你的服务器而不是中间人伪装的。对于前后端分离项目升级HTTPS还有两个额外的重要理由现代浏览器安全策略Chrome、Firefox等主流浏览器会将HTTP页面标记为“不安全”严重影响用户体验和专业性。此外许多现代的Web API如地理位置、Service Worker等仅在HTTPS上下文中可用。解决混合内容阻塞如果你的前端页面通过HTTPS加载但其中的AJAX请求调用后端API还是HTTP浏览器会阻止这些“混合内容”请求导致前端无法获取数据控制台会报错。2.2 SSL证书类型与获取方式选择SSL证书主要分三类域名验证型DV、组织验证型OV、扩展验证型EV。对于大多数Web应用DV证书完全足够它只验证你对域名的所有权。免费证书推荐用于个人项目与测试环境Let‘s Encrypt目前最流行的免费CA。它通过ACME协议自动验证域名并签发有效期90天的证书。可以通过certbot工具自动化申请和续期。优点是免费、自动化程度高缺点是有效期短必须设置自动续期。云服务商提供国内如阿里云、腾讯云都提供免费的单域名DV证书有效期通常为1年申请流程在控制台完成相对简单。商业证书用于企业正式生产环境由DigiCert、GlobalSign等商业CA签发通常提供OV或EV验证信任等级更高浏览器兼容性最好并提供保险赔付。需要付费购买有效期通常为1年或更长。自签名证书仅用于本地开发与测试自己用openssl命令生成的证书。最大的问题是不会被任何客户端浏览器、移动端信任访问时会显示巨大的安全警告。仅适用于内部测试或开发联调绝对不可用于生产环境。方案选型建议对于个人项目、初创公司或测试环境强烈建议从Let‘s Encrypt开始它的自动化工具链非常成熟。对于要求稳定、免维护的企业生产环境可以使用云服务商的免费证书每年手动更新一次或购买商业证书。本次演示我们将以阿里云免费SSL证书和本地模拟的SpringBoot内置HTTPS两种场景来展开因为这是国内开发者最常遇到的组合。2.3 整体架构与流量走向在前后端分离项目中配置HTTPS通常有两种架构模式Nginx单向HTTPS最常用所有HTTPS的终止点在Nginx。客户端与Nginx之间是HTTPS加密通信Nginx解密后以HTTP协议将请求反向代理到后端的SpringBoot应用。SpringBoot本身不需要配置SSL。优点配置简单性能开销集中在Nginx后端应用无感知便于管理。缺点Nginx到后端服务器的链路如果是公网则这段通信是明文的通常在内网风险可控。全链路HTTPSNginx与SpringBoot之间也采用HTTPS。即客户端到NginxNginx到SpringBoot都是加密的。优点安全性最高即使是内网通信也加密。缺点配置复杂证书需要在Nginx和后端服务管理性能开销更大。绝大多数场景下模式一Nginx单向HTTPS完全满足安全需求且是业界最佳实践。我们的配置也将基于此模式进行。整个数据流如下用户浏览器 (HTTPS) - Nginx (解密) - (HTTP) - SpringBoot应用。3. 核心细节解析与实操要点3.1 SSL证书文件详解与准备无论从哪里获取证书你最终都会得到几个关键文件理解它们的作用至关重要.crt或.pem文件证书文件。里面包含服务器的公钥和证书信息。在Nginx配置中它对应ssl_certificate指令。.key文件私钥文件。这是最敏感的文件绝对不能泄露。它是在证书申请时由你在服务器上生成的对应Nginx的ssl_certificate_key指令。.ca-bundle或.chain.crt文件证书链文件。CA的证书是分级的根CA-中间CA-你的证书。为了让浏览器信任你的证书需要将中间CA可能还有根CA的证书一起发送给浏览器。这个文件包含了这些中间证书。在Nginx中它通常合并到同一个证书文件里或者通过ssl_certificate指令直接指定一个包含完整链的文件。以阿里云免费证书为例下载的证书包通常包含两个文件yourdomain.com.pem这就是证书文件但阿里云提供的这个.pem文件实际上已经包含了服务器证书和证书链。你可以用文本编辑器打开会看到多个-----BEGIN CERTIFICATE-----区块。yourdomain.com.key这就是私钥文件。操作要点将这两个文件上传到你的服务器建议放在一个安全的目录例如/etc/nginx/ssl/并确保Nginx进程用户通常是nginx或www-data有读取权限。使用命令chmod 400 yourdomain.com.key将私钥文件设置为仅所有者可读增加安全性。可以使用openssl x509 -in yourdomain.com.pem -text -noout命令查看证书的详细信息如有效期、颁发者、使用者等确保证书无误。3.2 SpringBoot后端配置的两种思路在后端我们需要根据架构模式做出选择。思路ASpringBoot不配置SSL仅处理HTTP配合Nginx单向HTTPS这是最推荐的方式。SpringBoot应用就像往常一样在application.properties中配置server.port8080或其他端口并以HTTP协议启动。所有安全、SSL卸载、静态资源压缩等工作都交给前端的Nginx。这样做的好处是应用逻辑干净与部署环境解耦。思路BSpringBoot内置HTTPS用于特定场景在某些无法使用Nginx的简单场景或者需要全链路HTTPS时可以启用SpringBoot自带的HTTPS支持。在application.properties中配置# 启用HTTPS指定证书和私钥路径支持PKS12或JKS格式 server.ssl.key-storeclasspath:keystore.p12 server.ssl.key-store-passwordyourpassword server.ssl.key-store-typePKCS12 # HTTP端口重定向到HTTPS可选 server.port8080同时如果你想将HTTP请求自动重定向到HTTPS需要额外的配置类。但请注意如果你的应用前面有Nginx这个重定向应该由Nginx来做而不是SpringBoot否则会形成重定向循环。实操心得除非你的应用是单体且直接对外暴露否则99%的情况应该选择思路A。让专业的工具做专业的事Nginx处理SSL和静态资源的效率远高于SpringBoot内嵌的Tomcat。将SpringBoot配置为HTTP也方便你在本地开发时直接调试无需关心证书问题。3.3 Nginx核心配置指令拆解Nginx的HTTPS配置核心在于server块中的几个ssl_*指令。理解每个指令的含义能让你在出问题时快速定位。server { listen 443 ssl http2; # 关键监听443端口启用ssl建议同时启用http2提升性能 server_name yourdomain.com www.yourdomain.com; # 1. 证书与私钥路径 ssl_certificate /etc/nginx/ssl/yourdomain.com.pem; ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key; # 2. SSL协议与加密套件配置安全加固 ssl_protocols TLSv1.2 TLSv1.3; # 禁用老旧不安全的SSLv2, SSLv3, TLSv1.0, TLSv1.1 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # 指定优先使用的加密套件 ssl_prefer_server_ciphers on; # 优先使用服务器端指定的加密套件 # 3. 性能与缓存优化 ssl_session_cache shared:SSL:10m; # 设置SSL会话缓存提升握手效率 ssl_session_timeout 10m; # 会话超时时间 # 4. 其他安全头部可选但推荐 add_header Strict-Transport-Security max-age31536000; includeSubDomains always; # HSTS强制浏览器使用HTTPS add_header X-Frame-Options DENY; # 防止点击劫持 add_header X-Content-Type-Options nosniff; # 这里是你的反向代理和静态文件配置... location / { root /path/to/your/vue/dist; index index.html; try_files $uri $uri/ /index.html; # 支持Vue Router的history模式 } location /api/ { proxy_pass http://localhost:8080/; # 反向代理到SpringBoot HTTP服务 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 重要告诉后端这是HTTPS过来的请求 } } # 5. HTTP强制跳转HTTPS另一个server块 server { listen 80; server_name yourdomain.com www.yourdomain.com; return 301 https://$server_name$request_uri; # 301永久重定向 }关键指令解析listen 443 ssl http2http2可以显著提升页面加载速度现代浏览器都支持在HTTPS上使用HTTP/2。ssl_protocols和ssl_ciphers这是安全的核心。上述配置禁用了已知存在漏洞的旧协议和弱加密算法。你可以使用在线工具如SSL Labs的SSL Test扫描你的域名检查配置是否安全。add_header Strict-Transport-SecurityHSTS头。浏览器收到后在有效期内这里是一年即使用户手动输入http://也会自动跳转到https://并且阻止不安全的连接。proxy_set_header X-Forwarded-Proto $scheme这个至关重要它将原始的协议$scheme在HTTPS访问时为https传递给后端的SpringBoot。这样当SpringBoot需要生成重定向URL或构建链接时例如在使用HttpServletRequest.getRequestURL()时才能得到正确的https前缀否则它可能错误地生成http链接。4. 完整实操流程从证书申请到服务上线4.1 阶段一申请与下载SSL证书以阿里云为例登录阿里云控制台进入“SSL证书应用安全”服务页面。购买证书在“证书资源包”或“免费证书”中选择“DV单域名证书”点击“立即购买”免费证书价格为0元。创建证书购买后在“我的证书”页面点击“创建证书”系统会生成一个待申请的证书实例。证书申请点击该证书实例的“申请”按钮。域名填写你需要绑定的域名例如api.yourdomain.com。注意免费证书通常只支持单个域名www.yourdomain.com和yourdomain.com算两个域名。个人信息按提示填写。验证方式选择“DNS验证”或“文件验证”。DNS验证需要在你的域名解析商处添加一条指定的TXT记录文件验证需要在你的网站根目录下放置一个指定的文件。根据指引完成验证。下载证书验证通过后通常几分钟到几小时证书状态变为“已签发”。点击“下载”选择“Nginx”服务器类型进行下载。你会得到一个包含.pem和.key文件的压缩包。4.2 阶段二服务器环境准备与文件部署假设你有一台安装了CentOS 7/8或Ubuntu 20.04/22.04的服务器并且已经安装了Nginx。上传证书文件使用scp或SFTP工具将下载的yourdomain.com.pem和yourdomain.com.key上传到服务器的安全目录例如sudo mkdir -p /etc/nginx/ssl sudo chmod 700 /etc/nginx/ssl # 上传文件后 sudo mv ~/yourdomain.com.pem /etc/nginx/ssl/ sudo mv ~/yourdomain.com.key /etc/nginx/ssl/ sudo chmod 400 /etc/nginx/ssl/yourdomain.com.key # 保护私钥 sudo chown nginx:nginx /etc/nginx/ssl/* # 确保Nginx用户有权读取根据你的Nginx运行用户调整确认SpringBoot后端运行确保你的SpringBoot Jar包已经以HTTP模式在运行例如监听在8080端口并且API接口可以正常通过http://服务器IP:8080/api/xxx访问。部署Vue前端静态文件将npm run build生成的dist目录上传到服务器例如/home/www/vue-project/dist。4.3 阶段三配置Nginx并启用HTTPS编辑Nginx配置文件通常主配置文件是/etc/nginx/nginx.conf它会包含/etc/nginx/conf.d/*.conf或/etc/nginx/sites-enabled/*。我们创建一个独立的配置文件更清晰sudo vim /etc/nginx/conf.d/yourdomain-ssl.conf写入配置内容将前面“3.3 Nginx核心配置指令拆解”部分的配置模板复制进去并根据你的实际情况修改以下关键点server_name改为你的域名。ssl_certificate和ssl_certificate_key确保路径指向你上传的.pem和.key文件。root指向你Vue项目的dist目录绝对路径。proxy_pass确保指向你的SpringBoot应用正确的HTTP地址和端口。测试配置并重载Nginxsudo nginx -t # 测试配置文件语法看到“syntax is ok”和“test is successful”才算成功 sudo systemctl reload nginx # 平滑重载配置不会中断现有连接 # 或者使用 sudo nginx -s reload4.4 阶段四验证与测试防火墙放行端口确保服务器的安全组云服务器或firewalld/iptables本地服务器已开放443端口。# 对于firewalld (CentOS/RHEL) sudo firewall-cmd --permanent --add-servicehttps sudo firewall-cmd --reload浏览器访问测试直接在浏览器中输入https://yourdomain.com。你应该能看到绿色的锁标志点击锁标志可以查看证书详情确认颁发者和有效期是否正确。API接口测试打开浏览器开发者工具F12的“网络(Network)”选项卡刷新页面观察所有前端发起的API请求通常以/api/开头的协议是否为https状态码是否为200。HTTP强制跳转测试在浏览器中输入http://yourdomain.com应该会自动跳转到https://yourdomain.com并且地址栏变为HTTPS。使用在线工具深度测试访问 SSL Labs SSL Test 网站输入你的域名进行扫描。目标是获得A或A的评分。报告会详细指出你配置中的安全问题如不安全的协议、弱加密套件等你可以根据报告进一步优化Nginx的ssl_ciphers等配置。5. 常见问题与排查技巧实录即使按照步骤操作也难免会遇到问题。下面是我在多次部署中积累的常见问题清单和排查思路。5.1 证书相关错误问题1浏览器提示“您的连接不是私密连接”NET::ERR_CERT_AUTHORITY_INVALID可能原因证书链不完整。浏览器没有收到中间CA证书。排查使用openssl s_client -connect yourdomain.com:443 -servername yourdomain.com命令连接你的服务器查看返回的证书链。如果只看到一张证书说明链不完整。解决确保你的ssl_certificate指令指向的文件包含了完整的证书链服务器证书中间CA证书。对于阿里云下载的Nginx证书.pem文件已经包含链直接使用即可。如果是其他来源的证书可能需要将服务器证书和中间证书文件合并到一个文件里cat yourdomain.crt intermediate.crt bundle.crt然后在Nginx中指向bundle.crt。问题2浏览器提示“证书与站点名称不匹配”可能原因证书绑定的域名与你访问的域名不一致。排查检查证书的Subject Alternative Name字段。用openssl x509 -in yourdomain.pem -text -noout | grep -A 1 “Subject Alternative Name”查看证书支持哪些域名。解决申请一张包含你正在使用的主机名的证书。例如如果你为www.yourdomain.com申请了证书那么直接访问yourdomain.com无www就会报此错。可以在申请证书时同时包含这两个域名这需要支持多域名的证书免费证书通常不支持或者在Nginx中用两个server块分别配置或者使用301重定向将其中一个跳转到另一个。5.2 Nginx配置与代理问题问题3Nginx启动失败或nginx -t测试报错常见错误SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch原因证书文件.pem和私钥文件.key不匹配。它们不是一对。解决重新下载正确的证书密钥对确保来自同一次申请。可以使用命令验证openssl x509 -noout -modulus -in yourdomain.pem | openssl md5和openssl rsa -noout -modulus -in yourdomain.key | openssl md5如果两个命令输出的MD5值相同则匹配。问题4前端可以访问但所有API请求都报404或500错误可能原因Nginx反向代理配置路径错误。排查检查Nginx的error.log通常位于/var/log/nginx/error.log看是否有代理相关的错误。检查proxy_pass指令location /api/ { proxy_pass http://localhost:8080/; }。注意尾部的/非常重要。如果后端SpringBoot的上下文路径是/api那么proxy_pass的URL结尾加/会将/api/xxx代理到http://localhost:8080/xxx。如果不加/则会代理到http://localhost:8080/api/xxx。请根据你后端服务的实际情况调整。在服务器上直接用curl测试后端服务是否正常curl http://localhost:8080/api/health。问题5前端页面通过HTTPS加载但图片、CSS等静态资源报混合内容错误Blocked loading mixed active content原因Vue等前端框架打包时资源链接可能还是http://。解决确保Vue项目的生产环境配置如.env.production中API基础URL是相对路径/api或完整的https://yourdomain.com/api而不是http://...。对于静态资源在Vue的配置文件如vue.config.js中设置publicPath为相对路径./或/。在Nginx配置中确保静态资源的location块也被正确地服务在HTTPS下。5.3 SpringBoot后端适配问题问题6SpringBoot应用生成的链接或重定向URL是HTTP而不是HTTPS原因当请求经过Nginx代理后SpringBoot通过HttpServletRequest获取到的scheme、serverPort等信息是Nginx与后端通信时的信息通常是HTTP和内部端口而非原始的HTTPS信息。解决这就是为什么在Nginx配置中必须添加proxy_set_header X-Forwarded-Proto $scheme;等头部。然后在SpringBoot应用中你需要告诉它信任这些来自代理的头部。如果你使用的是Spring Boot 2.x在application.properties中添加# 告诉Tomcat/Jetty/Undertow信任下游代理传来的X-Forwarded-*头部 server.forward-headers-strategynative # 或者使用框架提供的过滤器更通用 server.tomcat.remoteip.remote-ip-headerx-forwarded-for server.tomcat.remoteip.protocol-headerx-forwarded-proto对于更复杂的代理链如多层代理可以考虑在应用前加一个ForwardedHeaderFilterBean。问题7配置了HTTPS后SpringBoot Actuator、Swagger等端点访问异常原因这些组件在生成链接时同样依赖于请求的协议信息。如果未正确配置信任代理头它们生成的链接会是HTTP的。解决同上确保X-Forwarded-*头部被正确传递和信任。对于Swagger你可能还需要在配置中显式设置协议Docket实例中调用.protocols(new HashSet(Arrays.asList(“https”, “http”)))并设置.host(“yourdomain.com”)。5.4 进阶证书自动续期与更新对于Let‘s Encrypt的90天证书自动化续期是必须的。certbot工具可以完美解决。安装certbot以UbuntuNginx为例sudo apt update sudo apt install certbot python3-certbot-nginx获取并自动配置证书sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com按照交互提示操作certbot会自动修改你的Nginx配置添加SSL相关指令并设置好自动续期任务。测试自动续期sudo certbot renew --dry-run如果测试成功那么真正的续期任务会由系统的cron或systemd timer自动执行。你可以在/etc/crontab或/etc/systemd/system中找到相关定时任务。对于云服务商的1年期免费证书则需要每年手动下载一次新证书替换服务器上的旧文件然后重载Nginx。建议在日历上设置提醒。整个配置过程最关键的其实就是理解数据流HTTPS在哪里终止、证书文件的正确使用、以及Nginx配置中那几个核心的ssl_*指令和代理头部的设置。把这些理顺了无论是SpringBoot、Django还是其他任何后端配置HTTPS的思路都是相通的。安全无小事花点时间把HTTPS配好既是专业性的体现也是对用户数据的基本负责。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门