腾讯云服务器上用Docker部署SpringBoot项目设置http为https

绝地灬酷狼 2023-01-18 14:21 259阅读 0赞

SSL证书申请

  • 可以直接在腾讯云上申请免费的SSL证书
    在这里插入图片描述
  • 按照要求填好相关信息,一般一两分钟就可以签发

SpringBoot项目的配置

  • 将申请的证书下载下来解压,服务器有很多,比如Tomcat,Nginx,IIS等等,所以解压后的文件夹内有不同的子文件夹对应不同的服务器,由于SpringBoot默认是Tomcat,所以我这里用的Tomcat
  • 将Tomcat文件夹内的文件拷贝到项目的resources目录下,我这里是*******.jks文件(申请SSL证书时我输入了私钥密码,所以这里Tomcat文件夹内只有一个jks文件)
  • 在SpringBoot启动类中加入如下代码

    1. @Bean
    2. public ServletWebServerFactory servletContainer() {
    3. TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
    4. @Override
    5. protected void postProcessContext(Context context) {
    6. SecurityConstraint securityConstraint = new SecurityConstraint();
    7. securityConstraint.setUserConstraint("CONFIDENTIAL");
    8. SecurityCollection collection = new SecurityCollection();
    9. collection.addPattern("/*");
    10. securityConstraint.addCollection(collection);
    11. context.addConstraint(securityConstraint);
    12. }
    13. };
    14. tomcat.addAdditionalTomcatConnectors(initiateHttpConnector());
    15. return tomcat;
    16. }
    17. @Bean
    18. public Connector initiateHttpConnector() {
    19. Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
    20. connector.setScheme("http");
    21. connector.setPort(8080); // http端口
    22. connector.setSecure(false);
    23. connector.setRedirectPort(443); // application.properties中配置的https端口
    24. return connector;
    25. }
  • 配置文件application.yaml中加入如下配置

    1. server:
    2. port: 443
    3. ssl:
    4. key-store: classpath:【jks文件名】
    5. key-store-password: 【私钥密码】
    6. key-store-type: JKS
    7. enabled: true
  • 做完以上配置后打jar包,用docker部署就行,部署详情参考上一篇
  • 这里遇到了几个坑

    1. connector.setPort(8080);这地方如果设置为80,启动报错如下

      1. 19:12:36.824 logback [restartedMain] INFO o.s.s.c.ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor'
      2. 19:12:37.572 logback [restartedMain] INFO o.s.b.d.a.OptionalLiveReloadServer - LiveReload server is running on port 35729
      3. 19:12:37.620 logback [restartedMain] INFO o.a.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["https-jsse-nio-443"]
      4. 19:12:37.665 logback [restartedMain] INFO o.a.coyote.http11.Http11NioProtocol - Stopping ProtocolHandler ["http-nio-80"]
      5. 19:12:37.666 logback [restartedMain] INFO o.a.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-80"]
      6. 19:12:37.667 logback [restartedMain] ERROR o.apache.catalina.util.LifecycleBase - Failed to start component [Connector[HTTP/1.1-80]]
      7. org.apache.catalina.LifecycleException: Protocol handler start failed
      8. at org.apache.catalina.connector.Connector.startInternal(Connector.java:1008)
      9. at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
      10. at org.apache.catalina.core.StandardService.addConnector(StandardService.java:227)
      11. at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addPreviouslyRemovedConnectors(TomcatWebServer.java:263)
      12. at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:195)
      13. at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.startWebServer(ServletWebServerApplicationContext.java:297)
      14. at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:163)
      15. at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:552)
      16. at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
      17. at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:743)
      18. at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:390)
      19. at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
      20. at org.springframework.boot.SpringApplication.run(SpringApplication.java:1214)
      21. at org.springframework.boot.SpringApplication.run(SpringApplication.java:1203)
      22. at com.example.express.Application.main(Application.java:19)
      23. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      24. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      25. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      26. at java.lang.reflect.Method.invoke(Method.java:498)
      27. at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
      28. Caused by: java.net.BindException: Address already in use: bind
      29. at sun.nio.ch.Net.bind0(Native Method)
      30. at sun.nio.ch.Net.bind(Net.java:444)
      31. at sun.nio.ch.Net.bind(Net.java:436)
      32. at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:225)
      33. at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
      34. at org.apache.tomcat.util.net.NioEndpoint.initServerSocket(NioEndpoint.java:230)
      35. at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:213)
      36. at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1124)
      37. at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1210)
      38. at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:585)
      39. at org.apache.catalina.connector.Connector.startInternal(Connector.java:1005)
      40. ... 19 common frames omitted

      日志报端口占用,http默认端口本来就是80,这里设80就占用了?那不设呢,把这一行注释掉报错如下:

      1. 19:16:10.377 logback [restartedMain] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port(s): 443 (https) -1 (http)
      2. 19:16:10.393 logback [restartedMain] INFO o.a.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["https-jsse-nio-443"]
      3. 19:16:10.406 logback [restartedMain] INFO o.a.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio--1"]
      4. 19:16:10.418 logback [restartedMain] ERROR o.apache.catalina.util.LifecycleBase - Failed to initialize component [Connector[HTTP/1.1-auto-1]]
      5. org.apache.catalina.LifecycleException: Protocol handler initialization failed
      6. at org.apache.catalina.connector.Connector.initInternal(Connector.java:983)
      7. at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
      8. at org.apache.catalina.core.StandardService.initInternal(StandardService.java:533)
      9. at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
      10. at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:1059)
      11. at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
      12. at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:173)
      13. at org.apache.catalina.startup.Tomcat.start(Tomcat.java:456)
      14. at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:105)
      15. at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:86)
      16. at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:416)
      17. at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:180)
      18. at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:180)
      19. at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:153)
      20. at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
      21. at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
      22. at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:743)
      23. at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:390)
      24. at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
      25. at org.springframework.boot.SpringApplication.run(SpringApplication.java:1214)
      26. at org.springframework.boot.SpringApplication.run(SpringApplication.java:1203)
      27. at com.example.express.Application.main(Application.java:19)
      28. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      29. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      30. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      31. at java.lang.reflect.Method.invoke(Method.java:498)
      32. at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
      33. Caused by: java.lang.IllegalArgumentException: port out of range:-1
      34. at java.net.InetSocketAddress.checkPort(InetSocketAddress.java:143)
      35. at java.net.InetSocketAddress.<init>(InetSocketAddress.java:188)
      36. at org.apache.tomcat.util.net.NioEndpoint.initServerSocket(NioEndpoint.java:229)
      37. at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:213)
      38. at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1124)
      39. at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1137)
      40. at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:574)
      41. at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:74)
      42. at org.apache.catalina.connector.Connector.initInternal(Connector.java:980)
      43. ... 26 common frames omitted

      不设就没有端口可用了。。。设一个非80端口就好使

    2. application.yamlssl的配置中还有一个参数是server.ssl.key-alias:,这个参加貌似不能乱配,可能有讲究,我这里不知道配啥,删掉了,乱配报错如下:

      1. 19:20:54.048 logback [restartedMain] INFO o.s.s.c.ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor'
      2. 19:20:54.796 logback [restartedMain] INFO o.s.b.d.a.OptionalLiveReloadServer - LiveReload server is running on port 35729
      3. 19:20:54.852 logback [restartedMain] INFO o.a.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["https-jsse-nio-443"]
      4. 19:20:54.897 logback [restartedMain] ERROR o.apache.catalina.util.LifecycleBase - Failed to start component [Connector[HTTP/1.1-443]]
      5. org.apache.catalina.LifecycleException: Protocol handler start failed
      6. at org.apache.catalina.connector.Connector.startInternal(Connector.java:1008)
      7. at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
      8. at org.apache.catalina.core.StandardService.addConnector(StandardService.java:227)
      9. at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addPreviouslyRemovedConnectors(TomcatWebServer.java:263)
      10. at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:195)
      11. at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.startWebServer(ServletWebServerApplicationContext.java:297)
      12. at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:163)
      13. at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:552)
      14. at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
      15. at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:743)
      16. at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:390)
      17. at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
      18. at org.springframework.boot.SpringApplication.run(SpringApplication.java:1214)
      19. at org.springframework.boot.SpringApplication.run(SpringApplication.java:1203)
      20. at com.example.express.Application.main(Application.java:19)
      21. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      22. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      23. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      24. at java.lang.reflect.Method.invoke(Method.java:498)
      25. at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
      26. Caused by: java.lang.IllegalArgumentException: jsse.alias_no_key_entry
      27. at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:99)
      28. at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:71)
      29. at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:218)
      30. at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1124)
      31. at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1210)
      32. at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:585)
      33. at org.apache.catalina.connector.Connector.startInternal(Connector.java:1005)
      34. ... 19 common frames omitted
      35. Caused by: java.io.IOException: jsse.alias_no_key_entry
      36. at org.apache.tomcat.util.net.SSLUtilBase.getKeyManagers(SSLUtilBase.java:325)
      37. at org.apache.tomcat.util.net.SSLUtilBase.createSSLContext(SSLUtilBase.java:247)
      38. at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:97)
      39. ... 25 common frames omitted
      40. 19:20:54.898 logback [restartedMain] INFO o.a.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8080"]
      41. 19:20:54.916 logback [restartedMain] INFO o.a.coyote.http11.Http11NioProtocol - Pausing ProtocolHandler ["https-jsse-nio-443"]
      42. 19:20:54.916 logback [restartedMain] INFO o.a.coyote.http11.Http11NioProtocol - Pausing ProtocolHandler ["http-nio-8080"]
      43. 19:20:55.298 logback [restartedMain] INFO o.a.catalina.core.StandardService - Stopping service [Tomcat]
      44. 19:20:55.302 logback [restartedMain] INFO o.a.coyote.http11.Http11NioProtocol - Stopping ProtocolHandler ["http-nio-8080"]
      45. 19:20:55.308 logback [restartedMain] INFO o.apache.catalina.util.LifecycleBase - The stop() method was called on component [StandardServer[-1]] after stop() had already been called. The second call will be ignored.
      46. 19:20:55.308 logback [restartedMain] INFO o.a.coyote.http11.Http11NioProtocol - Stopping ProtocolHandler ["https-jsse-nio-443"]
      47. 19:20:55.308 logback [restartedMain] INFO o.a.coyote.http11.Http11NioProtocol - Destroying ProtocolHandler ["https-jsse-nio-443"]
      48. 19:20:55.308 logback [restartedMain] INFO o.a.coyote.http11.Http11NioProtocol - Destroying ProtocolHandler ["http-nio-8080"]
      49. 19:20:55.312 logback [restartedMain] INFO o.s.b.a.l.ConditionEvaluationReportLoggingListener -
      50. Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
      51. 19:20:55.318 logback [restartedMain] ERROR o.s.b.d.LoggingFailureAnalysisReporter -
      52. ***************************
      53. APPLICATION FAILED TO START
      54. ***************************
      55. Description:
      56. The Tomcat connector configured to listen on port 443 failed to start. The port may already be in use or the connector may be misconfigured.
      57. Action:
      58. Verify the connector's configuration, identify and stop any process that's listening on port 443, or configure this application to listen on another port.
      59. 19:20:55.323 logback [restartedMain] INFO o.s.s.c.ThreadPoolTaskExecutor - Shutting down ExecutorService 'applicationTaskExecutor'
      60. 19:20:55.325 logback [restartedMain] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
      61. 19:20:55.558 logback [restartedMain] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.
    3. 我这里启动类中http是设的8080端口,https是设的443端口,win10本地跑没问题,但打成jar包后,用docker部署时,docker run -d -p 【宿主机端口】:443 app指定端口映射时,宿主机端口应该指定多少呢?能不指定443吗?

非SpringBoot项目的配置

  • 不同证书类型,不同系统,不同服务器安装方式不同,参考SSL证书安装

发表评论

表情:
评论列表 (有 0 条评论,259人围观)

还没有评论,来说两句吧...

相关阅读

    相关 部署https请求

    因为苹果公司要求所有的API接口都必须要https的,所以没办法只能升级一下。现在阿里和腾讯的证书都还不错。这里记录一下腾讯云部署HTTPS的整个过程期间遇到了很多问题。在这里