【问题标题】:Hostname in certificate didn't match证书中的主机名不匹配
【发布时间】:2018-06-18 04:12:42
【问题描述】:

我已使用以下命令将证书生成到 keycloak 中

keytool -genkey -alias initcert  -keyalg  RSA  -keystore keycloak.jks  -validity 365  -keysize 2048

下面是上面命令的输出

Enter keystore password:
Re-enter new password:
What is your first and last name?
  [Unknown]:  initcert
What is the name of your organizational unit?
  [Unknown]:
What is the name of your organization?
  [Unknown]:
What is the name of your City or Locality?
  [Unknown]:
What is the name of your State or Province?
  [Unknown]:
What is the two-letter country code for this unit?
  [Unknown]:
Is CN=initcert, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?
  [no]:  yes

Enter key password for <initcert>
        (RETURN if same as keystore password):
Re-enter new password:

在此导出后导出到 keycloak

keytool -export -noprompt -trustcacerts -keystore keycloak.jks -alias initcert -file keycloak.cer -storepass keycloak

现在所有这些都使用相同的证书文件到 Windows10 客户端机器中并像这样在 Java 中导入

keytool -import -noprompt -trustcacerts -alias "initcert" -file keycloak.cer -keystore "C:\Program Files\Java\jdk1.8.0_152\jre\lib\security\cacerts"

但是当我尝试从 JBoss 服务器连接 keycloak 时,我得到了

证书中的主机名不匹配: !=

在 Jboss 服务器的独立文件中添加

<connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https" enable-lookups="false" secure="true">
                <ssl name="ssl" key-alias="initcert" password="keycloak" certificate-key-file="C:\Users\user\Documents\MyFiles\New\keycloak.jks" protocol="TLSv1,SSLv3,SSLv2" verify-client="false"/>

仅供参考,Keycloak 指向 OpenJDK,而客户端机器是 Oracle JDK。

我在生成证书的同一台机器上尝试了以下命令,它给出了正确的结果。

keytool -list -v -alias initcert -storepass keycloak -keystore keycloak.jks

上述命令的结果

Alias name: initcert
Creation date: Jan 9, 2018
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=initcert, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
Issuer: CN=initcert, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
Serial number: 2bb3190d
Valid from: Tue Jan 09 09:52:46 IST 2018 until: Wed Jan 09 09:52:46 IST 2019
Certificate fingerprints:
         MD5:  EF:A3:91:B8:B0:1C:61:F4:9D:9C:D6:05:37:D2:13:7D
         SHA1: 73:A1:DF:15:17:1F:0E:34:0C:44:ED:46:90:24:4E:75:F1:0E:BD:48
         SHA256: BE:5A:FE:06:97:E4:1C:55:14:E4:17:01:DD:02:76:88:44:7D:E5:39:4E:3C:5A:03:12:DD:3E:88:C1:96:9C:D2
         Signature algorithm name: SHA256withRSA
         Version: 3

Extensions:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: A0 57 CC B8 39 1C C9 1A   1A EE 74 72 90 99 89 8D  .W..9.....tr....
0010: 60 90 F3 A3                                        `...
]
]

【问题讨论】:

  • cn 应该是你服务器的主机名
  • 也可以是机器的ipaddress?
  • 否:它必须是 DNS 中定义的主机名
  • 服务器的 IP 地址将进入主题备用名称 (SAN) 字段。

标签: java ssl jboss keycloak


【解决方案1】:

确实,您必须在证书中提供正确的服务器完全限定域名 (FQDN)。但是,在证书的主题中设置 CN 实际上是不正确的,但仍然被许多实现支持。
在 X.509 证书中设置服务器名称(或 IP 地址)的正确方法是 Subject Alternative Name (SAN)
how to add subject alernative name to ssl certs?RFC-5280 了解更多信息。

【讨论】:

  • 你的意思是问题是CN名称吗?如果您也可以添加命令,这是否可能
  • 我创建了这样的证书keytool -genkey -alias initcert -ext san=ip:135.250.138.74 -keyalg RSA -keystore keycloak.jks -validity 365 -keysize 2048 即使现在我也遇到了同样的问题。
  • 证书中的名称必须与请求 URL 中使用的主机名或 IP 匹配。上面您说的错误消息是“证书中的主机名不匹配:”,它指的是您在证书中设置的另一个 IP:san=ip:135.250.138.74
  • 感谢您的回复,但我之前更改了服务器,我指向 而不是指向 135.250.138.74
  • 现在我看到这个代替了之前的异常17:49:36,943 ERROR [org.keycloak.adapters.OAuthRequestAuthenticator] (http-/0.0.0.0:8080-1) failed to turn code into token: java.net.SocketTimeoutException: Read timed out
猜你喜欢
  • 2013-10-18
  • 2016-08-09
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多