为本地主机创建自签名证书并将其导入 Glassfish

Create a self signed certificate for localhost and import it in Glassfish

我正在开发一个 运行 与 Glassfish 上的 Jersey 一起开发的 REST 服务器,我想在本地主机上的 HTTPS 上运行。

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

但他们没有回答我的(非常基本的)问题:如何生成自签名证书并在我的应用程序中使用它 运行s 在本地主机上的 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 returns no peer certificate available, No client certificate CA names sent

共同目标

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

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

开发人员设置

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

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

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

Certificate Filename Usage
Root CA mycompany.ca.pem The root certificate authority that is trusted by the Java runtime
Wildcard Certificate mycompany.ssl.p12 A password protected PKCS12 file deployed with the API

我的 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 文件的特定任务。许多系统提供 GUI 或 API 选项,用于将 PKCS12 文件加载到密钥库中。这可能会导致像这样的命令 运行,如果需要,您可以手动执行:

keytool -importkeystore -srckeystore mycompany.ssl.p12 -srcstoretype pkcs12 -destkeystore keystore.jks -deststoretype jks -v