自签名证书,Java、Hudson 和 JIRA

2022-09-03 06:03:14

我正在尝试设置Hudson JIRA插件。我们的JIRA服务器使用自签名SSL证书进行保护。我已经插入了我的Web浏览器使用keytool命令存储的证书,并让Hudson找到它。但现在它抱怨:

java.security.cert.CertificateException: No subject alternative names present

证书的公用名是“未知”,我在证书中看不到任何使用者替代名称

$ openssl x509 -in Unknown -text -noout
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number: 1214507595 (0x4863ea4b)
        Signature Algorithm: md5WithRSAEncryption
        Issuer: C=US, ST=NJ, L=[Our town], O=[Our company], OU=[Our project], CN=Unknown
        Validity
            Not Before: Jun 26 19:13:15 2008 GMT
            Not After : May  5 19:13:15 2018 GMT
        Subject: C=US, ST=NJ, L=[Our town], O=[Our company], OU=[Our project], CN=Unknown
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                [omitted]
    Signature Algorithm: md5WithRSAEncryption
        [omitted]

(标识已编辑并在括号中注明的信息。

有没有办法将使用者备用名称附加到此证书?还是有其他方法?还是我被迫破解Hudson Jira插件?


答案 1

用于访问 Jira 服务器的主机名(例如,https://jira.acme.com/ 中的 jira.acme.com)必须与使用者名称的 CN 字段之一匹配,或者如果不是,则必须与证书的使用者备用名称之一匹配。

RFC 2818 中对此进行了详细介绍:

在某些情况下,URI 被指定为 IP 地址而不是主机名。在这种情况下,iPAddress 使用者别名必须存在于证书中,并且必须与 URI 中的 IP 完全匹配。

在你的情况下,Java正在抱怨,因为CN(“未知”)和主题备用名称(因为你没有)都与Jira服务器的主机名不匹配。

因此,使用适当的 CN 生成证书,例如使用 :keytool

创建密钥对和自签名证书

$ keytool -genkey -alias jira_acme_com -keyalg RSA -keysize 2048 -validity 365 -keystore jira_acme_com.jks
Enter keystore password:  
Re-enter new password: 
What is your first and last name?
  [Unknown]:  jira.acme.com
What is the name of your organizational unit?
  [Unknown]:  Our project
What is the name of your organization?
  [Unknown]:  Our company
What is the name of your City or Locality?
  [Unknown]:  Our town
What is the name of your State or Province?
  [Unknown]:  NJ
What is the two-letter country code for this unit?
  [Unknown]:  US
Is CN=jira.acme.com, OU=Our project, O=Our company, L=Our town, ST=NJ, C=US correct?
  [no]:  y

Enter key password for 
        (RETURN if same as keystore password): 

查看个人信息

$ keytool -list -v -keystore jira_acme_com.jks 
Enter keystore password:  

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

Alias name: jira_acme_com
Creation date: Sep 4, 2010
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=jira.acme.com, OU=Our project, O=Our company, L=Our town, ST=NJ, C=US
Issuer: CN=jira.acme.com, OU=Our project, O=Our company, L=Our town, ST=NJ, C=US
Serial number: 4c81e9a9
Valid from: Sat Sep 04 10:39:37 CEST 2010 until: Sun Sep 04 10:39:37 CEST 2011
Certificate fingerprints:
     MD5:  15:6A:E3:14:E2:78:F4:95:41:E6:33:C9:F8:8B:64:23
     SHA1: CD:A6:9A:84:18:E8:62:50:2C:DC:2F:89:22:F6:BA:E9:1A:63:F6:C6
     Signature algorithm name: SHA1withRSA
     Version: 3

设置 Tomcat 以使用密钥库。

当然,如果要创建多宿主证书,则必须使用 OpenSSL(keytool 无法添加 X509 扩展,如使用者备用名称)。这些链接是很好的资源:

更新:鉴于您无法更改证书(您确实应该提到这一点),临时解决方案可能是更改所需计算机的本地文件以解析为计算机的真实IP。/etc/hostsUnknown

123.123.123.123    Unknown

以便您可以从这些计算机访问 https://Unknown/。但显然,这更像是一个肮脏的黑客,而不是一个真正的解决方案,并且无法扩展。

联系管理员以获得真正的“好”证书仍然是真正的好解决方案。

资源

引用


答案 2

如果我没有记错的话,SSL要求证书的公用名包含您尝试连接到的主机名,这样客户端就可以验证证书不仅在一般情况下受信任,而且在位置上受信任。

我假设你正在使用OpenSSL生成证书。有没有原因没有设置 ?cn=[yourserver]

可能是当它在公用名中找不到正确的主机名时,插件会尝试在主题 alt 名称中查找它,并且当由于没有 subjectAltName 而失败时,您会收到一条错误的错误消息。

无论如何,如果您将其用于多个站点,则需要在主题AltName中具有主机名。我找到了一个网站,其中记录了如何正确创建自签名证书。

http://library.linode.com/ssl-guides/subject-alt-name-ssl

希望这有帮助。


推荐