2016-05-31 32 views
1

我们最近从使用独立的Tomcat 8容器变为使用嵌入式Tomcat 8容器。我们在使用嵌入式容器的Grails 3.1.6上运行SSL时遇到了一些麻烦。我们一直使用APR Native Libraries和独立容器的certificateFile方法。我们希望使用嵌入式Tomcat保持这种方法,而不是改变为密钥存储方法。我尝试了Grails文档,深入Spring Boot嵌入式容器文档,但尚未找到工作解决方案。如何在Grails 3.1.6+中配置SSL?

我在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上提出一个新问题。提前致谢!

回答

2

即使在LD_LIBRARY_PATH上加载了APR本机库,也无法使用openssl certificateKeyFile方法。 (我认为如果你编辑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进行这项工作。)对于我来说,这不值得,所以这里是你如何使用密钥库方法来做到这一点。

我不得不使用Tomcat keytool方法重新键入证书。

然后,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. 
+0

添加以来编辑“评论必须大于6字符。 'key-store','keystore-password'和'key-password'属性必须缩进属于'ssl'部分。花了好几个小时试图弄清楚这一点。 – CoconutBandit