如何用ARTIFACTORY调试SSL问题

Tatarao Vana
2023-01-22 11:06

描述:

SSL通信在客户端(例如:Artifactory)和服务器(例如:DockerHub或RedHat CDN)之间以几种不同的方式进行。

  • 单向SSL(例如:Artifactory to DockerHub)
  • 双向SSL(例如:Artifactory to RedHat CDN)

在一种SSL方式中,服务器不验证客户端的身份来启动安全通信。下面是单向SSL握手过程中的事件流。

  1. 客户端将对服务器说Hello,并通过HTTPS协议请求资源。
  2. 服务器通过Hello响应其公共证书和公钥。
  3. 客户端根据其信任库检查服务器的公共证书,并验证收到的服务器证书,包括证书的过期日期、公共名称等。
  4. 客户端使用服务器的公钥发送一个对称会话密钥,该密钥可以被服务器的私钥解密。
  5. 服务器端使用其私有证书解密对称会话密钥,并将加密后的会话密钥发送回客户端,以建立安全通信。

这里有一个示例演示供您参考。旋度-v https://jpd.local/artifactory/api/system/ping
*正在输入X.X.X.X:443…
*与jpd连接。本地(X.X.X.X)端口443 (#0)
* ALPN,提供h2
* ALPN,提供http/1.1
*成功设置证书验证位置:
*文件:/etc/ssl/cert.pem
* CApath:无
* (304) (OUT), TLS握手,客户端hello (1):
* (304) (IN), TLS握手,服务器hello (2):
* TLSv1.2 (IN), TLS握手,证书(11):
* TLSv1.2 (IN), TLS握手,服务器密钥交换(12):
* TLSv1.2 (IN), TLS握手,服务器完成(14):
* TLSv1.2 (OUT), TLS握手,客户端密钥交换(16):
* TLSv1.2 (OUT), TLS更改密码,更改密码规格(1):
* TLSv1.2 (OUT), TLS握手,完成(20):
* TLSv1.2 (IN), TLS更改密码,更改密码规格(1):
* TLSv1.2 (IN), TLS握手,完成(20):
*使用TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384进行SSL连接
* ALPN,服务器接受使用http/1.1
*服务器证书:
*主题:CN=*.jfrog.io
*开始日期:2022年1月25日00:00:00 GMT
*过期日期:2月25日23:59:59 2023 GMT
* subjectAltName:主机“jpd”。本地“匹配的证书”*.jfrog.io”
*发行人:C=US;O = DigiCert公司;CN=GeoTrust TLS DV RSA Mixed SHA256 2020 CA-1
* SSL证书验证成功。
> GET /artifactory/api/system/ping HTTP/1.1
>主机:jpd.local
> User-Agent: curl/7.79.1 . txt
>接受:*/*
>
*标记bundle不支持多用途
< http /1.1 200 ok
<日期:周二,2022年9月06日18:09:35 GMT
< Content-Type: text/plain
< Transfer-Encoding:分块
< Connection: keep-alive
< X-JFrog-Version: Artifactory/7.42.2 74202900
< X-Artifactory-Id: 86c629150cb03e7755424f387c171443208912a8
< X-Artifactory-Node-Id: sandeepmkp-artifactory-primary-0
< Strict-Transport-Security: max-age=15724800;includeSubDomains
< X-Request-ID: 8b413ece59754445ef1eac6638fcf95b
<
*连接#0到主机jpd。局部完好无损
好吧

在双向SSL中,服务器还验证客户端的身份以启动安全通信。在Artifactory中,如果我们配置了一个需要基于SSL的认证的远程注册表,就可以看到双向SSL实现(例如:RedHat CDN).

例如,在导入证书之后,创建一个新的RPM远程存储库。在URL下,将URL传递给存储库(例如https://cdn.redhat.com/content/dist/rhel/server/7/7Server/x86_64/sat-tools/6.5/os),并通过导航到高级=>远程认证=> SSL / TLS证书并从下拉列表中选择证书来添加证书。

如果我们在这种类型的远程存储库上执行测试连接,上游注册中心将请求客户端证书,并在建立安全通信之前对其进行验证。如果客户端证书无效,我们将遇到“禁止”错误。

检查证书是否存在于JVM密钥存储库的最佳方法是什么?

JDK有一个内置的工具(例如:e keytool)用于检查JVM密钥存储库的内容。$ /opt/jfrog/artifactory/app/third-party/java/bin/keytool -v -list -keystore /opt/jfrog/artifactory/app/third-party/java/lib/security/cacerts -storepass changeit . keystore /opt/jfrog/artifactory/app/third-party/java/lib/security/cacerts

下载SSL证书的最佳方法是什么?

$ openssl s_client -connect <安全认证服务器IP和端口> -showcerts < /dev/null > server.crt
例子

RedHat CDN:
Openssl s_client -connect cdn.redhat.com:443 -showcerts < /dev/null > server.crt

LDAP或Active Directory:
Openssl s_client -connect the.ldap.server.net:636 -showcerts < /dev/null > server.crt

OAuth(使用授权URL)。例如,使用GitHub:
Openssl s_client -connect github.com:443 -showcerts < /dev/null > server.crt

如何查看SSL证书内容?

执行命令:openssl x509 -in server。crt语境

将SSL证书导入JVM密钥存储库的过程是什么?

如果您希望将SSL证书导入到Artifactory JVM keystore中,请将其放置在$JFROG_HOME/ Artifactory /var/etc/security/keys/trusted目录下。在每次启动期间,Artifactory Router将证书从受信任文件夹加载到JVM密钥存储库。如果证书已经存在于密钥存储库中,那么在启动过程中将跳过该证书。这里有一个示例条目供您参考。2022-09-06T19:23:00.175Z [jfrou] [INFO] [1c96451bef34e403][受信任的。]go:56] [main][] -以下证书已成功加载为TLS通信的受信任ca:
(/ opt / jfrog / artifactory / var /数据/路由器/键/相信/ access-root-ca。crt / opt / jfrog / artifactory / var / etc /安全/键/相信/ redhat-cdn-server.crt]

或者,我们还可以将证书添加到每个应用程序的KeyStore中。例如,要将证书添加到JFrog Artifactory Keystore中,可以将其直接添加到主机JVM的可信Keystore中。我们建议参考我们的文档管理TLS证书详细的见解。

从Artifactory的角度看SSL证书问题:

在运行Artifactory实例时,我们可能会在以下场景中遇到SSL问题。

  1. 连接到上游注册中心(例如:Dockerhub, RedHat CDN)
  2. Tomcat级别的SSL。
  3. 反向代理层

调试:
上游连接问题
如果在连接到上游Artifactory服务器时,日志中存在SSL错误,请启用以下调试日志记录器。当您在远程存储库设置上执行“测试连接”时,此记录器将打印条目。<记录器name = " org.artifactory.ui.rest.service.admin.configuration.repositories.util.RemoteRepositoryTestUrl " >
<级别值= "调试" / >
< / logger >

如果这些调试日志记录器不起作用,请添加以下任何一个调试日志记录器Artifactory系统配置文件(system.yaml)来捕获JVM级记录器。
-Djavax.net.debug = ssl握手
(或)
-Djavax.net.debug=all(这将打印大量日志,建议用于非prod环境调试)

下面是示例配置供您参考。共享:
使用Java 11发行版
# javaHome: " $ JFROG_HOME / artifactory / app /第三方/ java”

##额外的Java选项传递给JVM这些值添加到或覆盖默认值。
extraJavaOpts: "-Xms512m -Xmx4g -Djavax.net.debug=ssl,handshake"

此更改需要重新启动Artifactory实例。

Tomcat级别的SSL问题:

我们可以在Tomcat级别启用SSL配置,这可以通过在Artifactory微服务下的Tomcat httpconnector部分中提供有效的证书和密钥来实现。

的示例代码片段Artifactory系统配置文件。## artifactory模板
artifactory:
#端口:8081
在Artifactory端口上定制Tomcat连接器
tomcat:
## Artifactory连接器设置
##为artifactory设置HTTPS连接器
这将在默认的HTTP连接器之外打开一个端口。
httpsConnector:
##启用SSL/TLS连接器
启用:真

要用于HTTPS连接器的端口
端口:8443

##要使用的证书文件
certificateFile:“$ JFROG_HOME / artifactory / var / etc / artifactory /安全/ ssl / server.crt”

##要使用的证书密钥文件
certificateKeyFile:“$ JFROG_HOME / artifactory / var / etc / artifactory /安全/ ssl / server.key”

HTTPS连接器的额外配置。
##例如extraConfig: "SSLProtocol='TLSv1+TLSv1.1+TLSv1.2'"
# extraConfig:”“

如果这些参数配置错误,Artifactory将不会启动或生成异常。请检查Tomcat的catalina日志和$JFROG_HOME/artifactory/app/artifactory/ Tomcat /conf
/server.xml文件,该文件在每次Artifactory启动时生成,用于进一步调试。

反向代理级别SSL问题:

通常,如果在Artifactory前面配置了反向代理层,则SSL终止发生在反向代理层。下面是两个不同的第三方应用程序的配置示例。

Apache:< VirtualHost *: 443 >
SSLEngine上
SSLCertificateFile /etc/httpd/ssl/yourdomain.com.crt
SSLCertificateKeyFile /etc/httpd/yourdomain.com.key
SSLProxyEngine上
< /虚拟主机>

Nginx:TLSv1.1 TLSv1.2 TLSv1.3;
ssl_certificate /etc/nginx/ssl/yourdomain.com.crt;
ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key;
ssl_session_cache共享:SSL: 1米;
ssl_prefer_server_ciphers;

我们需要确保这些证书和密钥存在于具有相关权限的各自路径中。在一些情况下,我们可能不得不根据组织需求删除/阻止一些SSL协议。如果在启动期间或运行应用程序时出现任何问题,请检查反向代理日志以了解更多详细信息。如果SSL证书即将过期,我们需要获取新证书并替换它们。在这种情况下,只需要重新启动反向代理实例,因为我们只对该组件进行了更改(不需要重新启动Artifactory,因为我们没有对其进行任何更改。