spring - 如何在 Grails 3.1.6+ 中配置 SSL?

标签 spring ssl grails-3.1 embedded-tomcat-8

我们最近从使用独立 Tomcat 8 容器更改为使用嵌入式 Tomcat 8 容器。我们在让 SSL 在带有嵌入式容器的 Grails 3.1.6 上工作时遇到了一些问题。我们一直在使用带有独立容器的 APR native 库的certificateFile 方法。我们希望在嵌入式 Tomcat 中保留这种方法,而不是更改为 keystore 方法。我尝试了 Grails 文档,深入研究了 Spring Boot 嵌入式容器文档,但尚未找到可行的解决方案。

我在 application.yml 中尝试了许多不同的配置方法。基于几个不同的文档、来源等,我最新的尝试是:

environments:
  test:
    grails:
        server:
            port: 8443
            ssl:
                enabled: true
            certificateKeyFile: '/usr/share/app/my_domain_net.key'
            certificateFile: '/usr/share/app/my_domain_net.crt'
            certificateChainFile: '/usr/share/app/myCA.crt'
        serverURL: "https://test.mydomain.net:8443"
        tomcat:
            port: 8443
            ssl:
                enabled: true
            certificateKeyFile: '/usr/share/app/my_domain_net.key'
            certificateFile: '/usr/share/app/my_domain_net.crt'
            certificateChainFile: '/usr/share/app/myCA.crt'

我还尝试将其添加到 application.yml 的末尾:

server:
    port: 8443
    ssl:
        enabled: true
    certificateKeyFile: '/usr/share/app/my_domain_net.key'
    certificateFile: '/usr/share/app/my_domain_net.crt'
    certificateChainFile: '/usr/share/app/myCA.crt'

但这给了我一个“资源位置可能不为空”错误。目前我看到的大多数例子和问题都已经过时了。是时候在 stackoverflow 上问一个新问题了。提前致谢!

最佳答案

即使在 LD_LIBRARY_PATH 上加载了 APR native 库,也无法使用 opensslcertificateKeyFile 方法。 (我认为如果你编辑 grails-app/init/myapp/Application.groovy 并遵循 Spring 添加额外连接器的文档(位于 http://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-servlet-containers.html 的第 70.9 段),但这很困难,您需要阅读 org.springframework 源代码以弄清楚如何使用 openssl 证书和 APR Native 来实现此操作。)对我来说,它不值得,因此以下是使用 keystore 方法执行此操作的方法。

我必须使用 Tomcat keytool 方法重新设置证书 key 。

然后,application.yml 被更新为如下所示:

---
---
environments:
    development:
        server:
            port: 8080
            ssl:
                enabled: false
        grails:
            serverURL: "http://localhost:8080"

---
---
environments:
    test:
        server:
            port: 8443
            ssl:
                enabled: true
            key-store: classpath:my_domain_net.jks
            key-store-password: mypassword
            key-password: mypassword
        grails:
            serverURL: "https://test.mydomain.net:8443"

我准备证书的过程是:

1) create a directory for ssl_certificates
2) pick a Certificate Authority (I chose DigiCert)
3) use the CA's instructions for generating a csr for Tomcat:keytool
4) the CA's keytool command asks for a keystore password and key password
5) submit the csr and wait ~10 minutes for the cert to be issued
6) download the issued certificate as my_domain_net.p7b into the
   ssl_certificates folder created above
7) keytool -import -trustcacerts -alias server -file my_domain_net.p7b \
       -keystore my_domain_net
8) copy my_domain_net.jks into src/main/resources/ of your web project.

关于spring - 如何在 Grails 3.1.6+ 中配置 SSL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37557065/

相关文章:

java - Java 中非强制 bean

java - 如何正确使用 JTI 声明和 JWT 来防止重放攻击?

authentication - ReSTLet with Simple - 尽管 needClientAuthentication 设置为 true,它接受任何没有客户端证书的连接

ruby - 第一次安装 rails 无法连接到服务器

performance - Grails 3.1应用的内存监控

spring - 我可以在域对象构造函数中调用grails服务吗?

Spring JdbcTemplate/NamedParameterJdbcTemplate 将空值作为参数值传递

ssl - 使用某些 JDK 重置 Java TLS 连接

Spring 中启用 Apache Shiro 注释时未找到 Spring 数据 JPA 存储库