0

我正在开发一个在 Glassfish 上与 Jersey 一起运行的 REST 服务器,我想让它在 localhost 上的 HTTPS 上运行。

我找到了许多用于生成 CA 证书的教程,其他用于生成 .cer / .crt / .key / .csr / ... 文件的教程,其他用于生成 jks 密钥库的教程。

但他们没有回答我的(非常基本的)问题:如何生成自签名证书并将其用于在本地主机上的 Glassfish 上运行的我的应用程序中?从头开始到真正使用的集成,无需任何具有 crt、jks 或任何其他文件的先决条件。

(有关信息,我使用 Linux)

谢谢

编辑:我终于用以下命令创建了一个证书

openssl req -x509 -out localhost.crt -keyout localhost.key \
  -newkey rsa:2048 -nodes -sha256 \
  -subj '/CN=localhost' -extensions EXT -config <( \
   printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")
openssl pkcs12 -export -name localhostServerCert -in localhost.crt -inkey localhost.key -out localhostP12Keystore.p12
keytool -importkeystore -destkeystore localhostKeystore.jks -srckeystore localhostP12Keystore.p12 -srcstoretype pkcs12 -alias localhostServerCert
copy localhostKeystore.jks into /glassfish/domains/domain1/config
keytool -importkeystore -srckeystore localhostKeystore.jks -destkeystore keystore.jks

我已经在管理控制台中使用证书昵称修改了 http-listener-2 localhostServerCert,但是在 https://localhost:8181 (ERR_CONNECTION_REFUSED) 上出现错误页面

编辑2:我认为证书应该有问题,因为openssl s_client -showcerts -connect localhost:8181退货no peer certificate availableNo client certificate CA names sent

4

1 回答 1

1

共同目标

在本地使用 SSL 运行会很有用,我喜欢从真实世界的 URL 开始。这也可以帮助您提前考虑您的生产部署设计,如今这通常涉及基于自发行根 CA 的私有 PKI。

如今,Web 和 API 域有时可能相关,例如,如果 API 为 Web 源发布安全 cookie。因此,对于 localhost 开发,我首先定义如下 URL:

开发者设置

然后将这样的条目添加到我的主机文件中:

127.0.0.1 localhost web.mycompany.com api.mycompany.com
:1        localhost

然后,就证书而言,我生成了这些可部署的文件:

证书 文件名 用法
根 CA 我的公司.ca.pem Java 运行时信任的根证书颁发机构
通配符证书 我的公司.ssl.p12 使用 API 部署的受密码保护的 PKCS12 文件

My Development Certificates Repository有一个如何使用 openssl 颁发证书的示例,包括可用于您自己的域的 bash 脚本。本质上,这是用于开发计算机的私有 PKI。

配置信任

然后,您只需要信任 Glassfish 使用的 Java 运行时中的根 CA。就我个人而言,我倾向于尽可能避免使用 JKS 文件,因为它们特定于 Java,而 PKCS12 文件是一个更便携的概念:

sudo "$JAVA_HOME/bin/keytool" -import -alias mycompanyroot -cacerts -file ~/Desktop/mycompany.ca.pem -storepass changeit -noprompt

更多开发者设置信息

下面提供了这些以可移植方式管理 SSL 开发证书的资源,从而完成了架构工作:

System.setProperty(
  "server.ssl.key-store", 
  configuration.getApi().getSslCertificateFileName());

System.setProperty(
  "server.ssl.key-store-password",
  configuration.getApi().getSslCertificatePassword());

玻璃鱼

如果基于 Glassfish 的设置意味着 API 本身不加载 PKCS12 文件,则可能存在导入 PKCS12 文件的特定任务。许多系统提供用于将 PKCS12 文件加载到密钥库中的 GUI 或 API 选项。这可能会导致运行这样的命令,如果需要,您可以手动执行:

keytool -importkeystore -srckeystore mycompany.ssl.p12 -srcstoretype pkcs12 -destkeystore keystore.jks -deststoretype jks -v
于 2022-01-01T12:12:41.257 回答