ARTIFACTORY:如何调试ARTIFACTORY的SSL问题
描述:
SSL通信在客户端(例如:Artifactory)和服务器(例如:DockerHub或RedHat CDN)之间以几种不同的方式发生。
- 单向SSL(例如:人工到DockerHub)
- 双向SSL(例如:人工到RedHat CDN)
在SSL的一种方式中,服务器不验证客户机的身份以启动安全通信。下面是单向SSL握手过程中的事件流。
- 客户端将对服务器说Hello并通过HTTPS协议请求资源。
- 服务器通过说Hello来响应它的公共证书和公钥。
- 客户机根据其信任存储库检查服务器的公共证书,并验证接收到的服务器证书,包括证书的过期日期、通用名称等。
- 客户端使用服务器的公钥发送一个对称会话密钥,该密钥可以通过服务器的私钥解密。
- 服务器使用其私有证书解密对称会话密钥,并将加密的会话密钥发送回客户端,以建立安全通信。
这里有一个示例演示供您参考。旋度-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握手,Server hello (2):
* TLSv1.2 (IN), TLS握手,证书(11):
* TLSv1.2 (IN), TLS握手,服务器密钥交换(12):
* TLSv1.2 (IN), TLS握手,Server finished (14):
* TLSv1.2 (OUT), TLS握手,客户端密钥交换(16):
* TLSv1.2 (OUT), TLS change cipher, change cipher spec (1):
* TLSv1.2 (OUT), TLS握手,Finished (20):
* TLSv1.2 (IN), TLS更改密码,更改密码规范(1):
* TLSv1.2 (IN), TLS握手,Finished (20):
* SSL连接使用TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN,服务器接受使用http/1.1
*服务器证书:
*主题:CN=*.jfrog.io
*开始日期:2022年1月25日00:00:00 GMT
*到期日期:2月25日23:59:59 2023 GMT
* subjectAltName: host "jpd. name "。本地“匹配证书的”*.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
>接受:*/*
>
*将bundle标记为不支持多用途
< http /1.1 200 ok
日期:星期二,2022年9月6日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),并通过导航到Advanced => Remote Authentication => SSL / TLS certificate添加证书,并从下拉列表中选择证书。
如果我们在此类远程存储库上执行测试连接,上游注册中心将请求客户端证书,并在建立安全通信之前对其进行验证。如果客户端证书无效,我们将遇到“forbidden”错误。
检查证书是否存在于JVM密钥库中的最佳方法是什么?
JDK有一个内置的工具(i。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 . sh
下载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密钥库,请将它们放在$JFROG_HOME/ Artifactory /var/etc/security/keys/trusted目录中。在每次启动期间,Artifactory Router将证书从受信任文件夹加载到JVM密钥库中。如果证书已经存在于密钥存储库中,那么将在启动过程中跳过它。这里有一个示例条目供您参考。2022-09-06T19:23:00.175Z [jfrou] [INFO] [1c96451bef34e403] [trusted.]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证书有关详细的见解。
从人工角度看SSL证书问题:
在运行Artifactory实例时,我们可能会在以下场景中遇到SSL问题。
- 连接到上游注册表(例如:Dockerhub, RedHat CDN)
- 在Tomcat级别SSL。
- 在反向代理层
调试:
上游连接问题
如果在连接到上游Artifactory服务器时,日志中有SSL错误,请启用以下调试日志记录器。当您在远程存储库设置上执行“Test Connection”时,这个日志记录器将打印条目。<记录器name = " org.artifactory.ui.rest.service.admin.configuration.repositories.util.RemoteRepositoryTestUrl " >
<级别值= "调试" / >
< / logger >
如果这些调试日志记录器不起作用,请添加以下任何一个调试日志记录器人工系统配置文件(system.yaml)来捕获JVM级别的日志记录器。
-Djavax.net.debug = ssl握手
(或)
-Djavax.net.debug=all(这将打印大量日志,建议用于非prod环境调试)
下面是示例配置供您参考。共享:
使用Java 11发行版
# javaHome: " $ JFROG_HOME / artifactory / app /第三方/ java”
传递给JVM的额外Java选项。这些值添加或覆盖默认值。
extraJavaOpts: "-Xms512m -Xmx4g -Djavax.net.debug=ssl,handshake"
此更改需要重新启动Artifactory实例。
Tomcat级SSL问题:
我们可以在Tomcat级别启用SSL配置,这可以通过在Artifactory微服务下的Tomcat的httpconnector部分中提供有效的证书和密钥来实现。
的示例片段人工系统配置文件。artifactory模板
artifactory:
#端口:8081
Artifactory端口上的Tomcat连接器定制
tomcat:
人工连接器设置
为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连接器的额外配置。
extracconfig: "SSLProtocol='TLSv1+TLSv1.1+TLSv1.2'"
# extraConfig:”“
如果这些参数配置错误,Artifactory将不会启动或产生异常。请检查Tomcat的catalina日志和$JFROG_HOME/artifactory/app/artifactory/ Tomcat /conf
每次Artifactory启动时生成的/server.xml文件,以便进一步调试。
反向代理级别SSL问题:
通常,如果在Artifactory之前配置SSL,则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,因为我们没有对其进行任何更改)。
