ClickHouse数据库SSL配置和SSL连接测试
目录
1.Server SSL配置介绍
2.Client SSL访问配置的介绍
3.my测试环境上开启ClickHouse Server SSL配置 & 客户端SSL访问的配置流程
4.附录
1)SSL证书的几种类型
单域名SSL证书
通配符SSL证书
多域名SSL证书
多域名通配符SSL证书
2)单域名SSL证书生成
3)通配符SSL证书(泛域名SSL证书)生成
4)多域名通配符SSL证书(配置了 SAN)生成
5)Java 默认内置的根证书
ClickHouse数据库SSL配置和SSL连接测试
1.Server SSL配置介绍
1)Configuring SSL User Certificate for Authentication(配置使用 SSL 用户证书进行身份验证):
英文:
https://clickhouse.com/docs/en/guides/sre/ssl-user-auth
中文:
https://clickhouse.ac.cn/docs/en/guides/sre/ssl-user-auth
2)Configuring SSL-TLS(配置 SSL-TLS):
英文:
https://clickhouse.com/docs/en/guides/sre/configuring-ssl
中文:
https://clickhouse.ac.cn/docs/en/guides/sre/configuring-ssl
3)SSL X.509 certificate authentication:
英文:
https://clickhouse.com/docs/en/operations/external-authenticators/ssl-x509
中文:
https://clickhouse.ac.cn/docs/en/operations/external-authenticators/ssl-x509
4)Global Server Settings(其中包含了 openSSL 服务器配置文件中的ssl相关配置、以及秘钥和证书文件的说明)
在 openSSL 章节描述了 privateKeyFile 、certificateFile 、caConfig、verificationMode、loadDefaultCAFile、extendedVerification 等配置参数。
英文:
https://clickhouse.com/docs/en/operations/server-configuration-parameters/settings#openssl
中文:
https://clickhouse.ac.cn/docs/en/operations/server-configuration-parameters/settings#openssl
2.Client SSL访问配置的介绍
1)JDBC Connect to ClickHouse with SSL:
英文:
https://clickhouse.com/docs/en/integrations/java/jdbc-driver
中文:
https://clickhouse.ac.cn/docs/en/integrations/java/jdbc-driver
里面介绍了JDBC SSL连接相关的SSL参数(SSL Properties)。
JDBC 连接相关的 SSL 参数:
Name | Default Value | Optional Values | Description
ssl | false | true, false | Whether to enable SSL/TLS for the connection
sslmode | strict | strict, none | Whether to verify SSL/TLS certificate
sslrootcert | -- | -- | Path to SSL/TLS root certificates
sslcert | -- | -- | Path to SSL/TLS certificate
sslkey | -- | -- | RSA key in PKCS#8 format
key_store_type | -- | JKS, PKCS12 | Specifies the type or format of the keystore/truststore file
trust_store | -- | -- | Path to the truststore file
key_store_password | -- | -- | Password needed to access the keystore file specified in the keystore config
2)关于 sslmode 参数值:
https://github.com/ClickHouse/poco/blob/master/NetSSL_OpenSSL/include/Poco/Net/Context.h
中有相更详细的介绍。
sslmode 支持: none | relaxed | strict| once。
服务器支持这四种配置,JDBC连接参数官方描述仅支持 none 和 strict 两种。
sslmode=none :
VERIFY_NONE = SSL_VERIFY_NONE。
访问走 https 加密协议。
Server:服务端不会要求客户端提供证书。服务端不会向客户端发送证书提供请求,所以,客户端压根不会发送证书给服务端。
Client:如果不使用匿名密码(默认禁用),服务端将会发送证书给客户端,客户端会校验,但校验结果将被忽略。无论校验成功还是校验失败,最终都是连接成功。
sslmode=relaxed :
VERIFY_RELAXED = SSL_VERIFY_PEER。【宽松检查】
访问走 https 加密协议。
Server: 服务端会要求客户端必须提供证书。服务端会向客户端发送证书提供请求。
客户端如果有证书:会发送证书给服务端。则服务端会校验客户端发送的证书。如果证书校验失败、则TLS/SSL握手阶段失败、连接立即失败。
客户端如果无证书:则不会发送证书给服务端。服务端不涉及证书校验。
Client: 如果服务端提供了证书、会校验服务端证书,如果证书校验失败、连接失败。如果服务端无证书,则不校验。
sslmode=strict :
VERIFY_STRICT = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT。 【严格检查】
访问走 https 加密协议。
Server: 服务端会要求客户端必须提供证书。如果客户端未提供证书、或者提供了证书但证书校验失败,则TLS/SSL握手阶段失败、连接立即失败。
Client: 和relaxed模式的Client行为相同。
sslmode=once :
VERIFY_ONCE = SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE。
访问走 https 加密协议。
Server:服务端只在TLS/SSL握手阶段要求客户端必须提供证书。
Client: 和relaxed模式的Client行为相同。
ClickHouse JDBC SSL 访问格式:
Driver Class: com.clickhouse.jdbc.ClickHouseDriver
URL Syntax: jdbc:(ch|clickhouse)[:<protocol>]://endpoint1[,endpoint2,...][/<database>][?param1=value1¶m2=value2][#tag1,tag2,...], for example:
jdbc:ch://localhost is same as jdbc:clickhouse:http://localhost:8123
jdbc:ch:https://localhost is same as jdbc:clickhouse:http://localhost:8443?ssl=true&sslmode=STRICT
jdbc:ch:grpc://localhost is same as jdbc:clickhouse:grpc://localhost:9100
ClickHouse 默认端口:
http/https 端口:
8123: 默认http端口(clickhouse-client(common client)、clickhouse-http-client、clickhouse-jdbc-client 访问端口)
8443: 默认https端口(clickhouse-client(common client)、clickhouse-http-client、clickhouse-jdbc-client SSL安全访问端口)
tcp/tcps 端口:
9000: 默认tcp端口(clickhouse-cli-client、clickhouse-native-jdbc-client 访问端口)
9440:默认tcp安全端口(clickhouse-cli-client、clickhouse-native-jdbc-client SSL安全访问端口)
grpc/grpcs端口:
9100: 默认grpc(google RCP)端口,grpc/grpcs。
ClickHouse JDBC 和 Native JDBC 区别:Native JDBC 基于TCP协议,支持压缩等高级特性、性能高,但部分SQL语法该方式不支持。
示例1:
String url = "jdbc:ch://your-server:8443/default";
Properties properties = new Properties();
properties.setProperty("ssl", "true");
properties.setProperty("sslmode", "strict"); // NONE to trust all servers; STRICT for trusted only
properties.setProperty("sslrootcert", "/mine.crt");
try (Connection con = DriverManager
.getConnection(url, properties)) {
try (PreparedStatement stmt = con.prepareStatement(
// place your code here
}
}
3.my测试环境上开启ClickHouse Server SSL配置 & 客户端SSL访问的配置流程
准备工作
ssl 证书查看相关命令:
openssl x509 -in ca.crt -noout -text #查看CA证书内容(-text 打印其他所有信息,-noout 不打印证书信息)
openssl x509 -in ca.crt -text #查看CA证书内容(-text 打印其他所有信息)
openssl rsa -in chnode1.key -text #查看Server私钥文件中的私钥信息
openssl x509 -in chnode1.crt -noout -text #查看Server证书详细信息(包括公钥)
openssl rsa -in client1.key -text #查看Client私钥文件中的私钥信息
openssl x509 -in client1.crt -noout -text #查看Client证书详细信息(包括公钥)
1)进入容器内操作
docker exec -it clickhouse-server /bin/bash
2)先确认是否安装了 openssl,如果没有装、需要先安装
openssl
如果命令不存在、则先执行下面命令安装:
yum install -y openssl
3)创建证书目录
一般证书放在配置目录下( mkdir -p /etc/clickhouse-server/certs ) 。
我因为 docker 容器挂载没有直接挂整个配置目录、而只挂了配置文件,所以,我把证书文件在数据库目录 /var/lib/clickhouse 下了:
mkdir -p /var/lib/clickhouse/certs
4)切换到证书目录
cd /var/lib/clickhouse/certs
接下来参考 配置 SSL-TLS 的文档 https://clickhouse.ac.cn/docs/en/guides/sre/configuring-ssl 继续操作、创建和配置证书。
注意:我没有配置使用SSL用户证书进行身份验证,只是配置了 SSL-TLS 证书验证。
如果实际业务需求需要配置使用SSL用户证书进行身份验证的话,可以参考官方资料介绍:https://clickhouse.ac.cn/docs/en/guides/sre/ssl-user-auth
两者配置有区别。
1)服务端生成 CA 私钥,生成 ca.key:
openssl genrsa -out ca.key 2048
2)服务端生成自签名 CA 证书,生成 ca.crt,该证书将用于使用 CA 密钥签署其他证书:
openssl req -x509 -subj "/C=CN/ST=ZJ/L=HZ/O=mytest01/OU=RD/CN=ca" -nodes -key ca.key -days 3650 -out ca.crt
注意:在创建证书请求文件的时候需要注意几点,下面生成服务器请求文件和客户端请求文件均要注意这三点:
a)根证书的CN(Common Name)填写 ca 或者 root 就可以了,而所有客户端和服务器端的证书的这个字段需要填写域名或IP;
b)一定要注意的是:根证书的这个 CN 字段和客户端证书、服务器端证书不能一样;
c)其他所有字段的填写,根证书、服务器端证书、客户端证书三者需保持一致、最后的密码可以直接回车跳过。
验证 CA 证书内容、查看所有信息:
openssl x509 -in ca.crt -text
注意:
clickhouse-server 和 clickhouse-client(clickhouse CLI命令行)用到的 ca 是 ca.crt (一般 c 语言用的是 ca.crt),
如果存在 Java 客户单使用 ca 证书时,用的是 JKS 证书、Java9及以上保本默认用 PKCS12 证书。这里可以按需选择是否要将 ca.crt 导出成 JKS、PKCS12 格式证书。
将 ca.crt(x509格式)证书导入生成 truststore(JKS),设置一个证书信息提取密码,我设置了:1q2w3e。
提示 Trust this certificate? [no]: yes 则输入 yes。生成 JKS truststore 的命令如下:
keytool -importcert -alias ca -file ca.crt -keystore truststore -storepass 1q2w3e
查看truststore中的证书信息:
keytool -list -v -keystore truststore
3)创建服务端证书请求(CSR)并生成服务端私钥(如果服务端是集群、则需要为每个节点创建一个),生成 chnode1.csr、chnode1.key:
openssl req -newkey rsa:2048 -nodes -subj "/C=CN/ST=ZJ/L=HZ/O=mytest01/OU=RD/CN=chnode1.mytest01.com" -keyout chnode1.key -out chnode1.csr
关于CN和SAN:
CN(Common Name 公共名)和 SAN(Subject Alternative Name 主题备用名)匹配来增强服务器端证书验证。
如果配置文件启用服务器主机名验证时,证书中包含的 CN 和 SAN 值将与服务器的主机名进行比较。如果配置的主机名与证书中的 CN 或 SAN 值不匹配,那么与后端服务器的连接将失败。SAN 支持泛域名。
SAN 是 SSL 标准 x509 中定义的一个扩展。使用了 SAN 字段的 SSL 证书,可以扩展此证书支持的域名,使得一个证书可以支持多个不同域名的解析,不再需要为每一个域名买一个 SSL 证书了。
CN 和 SAN 的一般规则:
CN -- 一般把你的主 URL(主机域名或者 /etc/hosts 中 IP 对应的 hostname) 放在这个通用名配置中(为了兼容性)。
SAN -- 一般把你所有的域放在这个主体备用名配置中,重复 CN。
CN 字段已被弃用、但仍然被广泛使用。为了确保绝对正确,您应该将所有名称都放入 SAN 字段中。CN 字段应该包含主题名称而不是域名。
假设使用者备用名(SAN)属性包含两个 DNS 的话,例如:
mytest01.com
chnode1.mytest01.com
设置 CN 时、仅设置两者之一:CN=domain.example。不能同时设置两个 CN,因为 CN 只能保存一个名称。
您可以使用2个简单的 CN 证书而不用一个 CN + SAN 证书的话,您需要2个 IP 地址。
如果一个证书要保护多个域名或者子域名,则可以参考后面附录中的泛域名SSL证书、多域名SSL证书生成方式。
openssl rsa -in chnode1.key -text #查看Server私钥文件中的私钥信息
4)使用服务端证书请求 CSR 和 CA 根证书,创建服务端证书密钥对(如果服务端是集群、则需要为每个节点创建一对服务端密钥对),生成 chnode1.crt(指定 -CAcreateserial 参数同时会自动生成一个 ca.srl,否则会因为 ca.srl 不存在而报错)
openssl x509 -req -in chnode1.csr -out chnode1.crt -CA ca.crt -CAkey ca.key -days 3650 -CAcreateserial
验证服务端证书 & 私钥文件内容、查看所有信息:
openssl x509 -in chnode1.crt -noout -text #查看Server证书详细信息(包括公钥)
openssl rsa -in chnode1.key -text #查看Server私钥文件中的私钥信息
5)检查新生成的服务端证书是否已针对 CA 证书进行验证(通过):
openssl verify -CAfile ca.crt chnode1.crt
chnode1.crt: OK
服务端秘钥和证书生成完毕,生成的文件列表如下:
root@39f30b0a4934:/var/lib/clickhouse/certs# ls -l
total 28
-rw-r--r-- 1 root root 1074 Oct 31 19:25 ca.crt
-rw-r--r-- 1 root root 1675 Oct 31 19:25 ca.key
-rw-r--r-- 1 root root 17 Oct 31 19:26 ca.srl
-rw-r--r-- 1 root root 973 Oct 31 19:26 chnode1.crt
-rw-r--r-- 1 root root 899 Oct 31 19:25 chnode1.csr
-rw-r--r-- 1 root root 1704 Oct 31 19:25 chnode1.key
-rw-r--r-- 1 root root 812 Oct 31 19:27 truststore
如果前面没有生成 truststore 则文件列表如下:
root@39f30b0a4934:/var/lib/clickhouse/certs# ls -l
total 24
-rw-r--r-- 1 root root 1074 Oct 31 19:25 ca.crt
-rw-r--r-- 1 root root 1675 Oct 31 19:25 ca.key
-rw-r--r-- 1 root root 17 Oct 31 19:26 ca.srl
-rw-r--r-- 1 root root 973 Oct 31 19:26 chnode1.crt
-rw-r--r-- 1 root root 899 Oct 31 19:25 chnode1.csr
-rw-r--r-- 1 root root 1704 Oct 31 19:25 chnode1.key
6)如果是集群、请确认为每个节点都生成了服务端证书和秘钥,或者使用泛域名SSL证书。
如果访问的域名和证书秘钥库中的域名不匹配的话,会报错:
Caused by: java.security.cert.CertificateException: No name matching chnode2.mytest01.com found
at sun.security.util.HostnameChecker.matchDNS(HostnameChecker.java:231)
at sun.security.util.HostnameChecker.match(HostnameChecker.java:96)
at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:462)
at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:428)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:209)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:132)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1621)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:223)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1037)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:965)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1064)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1395)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1379)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
7)生成客户端证书和秘钥:
非必须的步骤。如果需要双向认证,可以继续为客户端创建客户端证书密钥对。如果不需要双向认证,这步可以跳过(因为后续客户端配置时无需指定客户端证书和秘钥)。
和前面服务器证书生成类似,参考前面的步骤,生成客户端的证书密钥对,命令如下:
openssl req -newkey rsa:2048 -nodes -subj "/C=CN/ST=ZJ/L=HZ/O=mytest01/OU=RD/CN=client1.mytest01.com" -keyout client1.key -out client1.csr
openssl x509 -req -in client1.csr -out client1.crt -CA ca.crt -CAkey ca.key -days 3650
如果客户端应用 JDBC 连接参数 sslkey 要求使用 其他格式(PKCS#8 或 PKCS#12),RSA私钥是PKCS#1、可以通过openssl命令转换成Apache读取证书私钥格式PKCS#8、或者PKCS#12:
openssl pkcs8 -topk8 -inform PEM -in client1.key -outform PEM -nocrypt -out client1.p8 #生成 PCKS#8 格式的 Client 证书(如果需要)
openssl pkcs12 -export -in client1.crt -inkey client1.key -name client1 -out client1.p12 #生成 PCKS#12 格式的 Client 证书(如果需要)
如果客户端应用需要用到JKS格式的keystore(Java应用用JKS格式),可以将将 PCKS#12 转换成JKS keystore:
keytool -importkeystore -v -srckeystore client1.p12 -srcstoretype pkcs12 -srcstorepass 1q2w3e -destkeystore client1.keystore -deststoretype jks -deststorepass 1q2w3e #生成 jks 格式的 keystore(如果需要)
openssl rsa -in client1.key -text #查看Client私钥文件中的私钥信息
openssl x509 -in client1.crt -noout -text #查看Client证书详细信息(包括公钥)
openssl verify -CAfile ca.crt client1.crt #检查新生成的客户端证书是否已针对 CA 证书进行验证(通过)
注意:
如果后续有不同类型的客户端、需要用到不同格式的证书(例如:JKS、PKCS12 格式),生成客户端证书和私钥后,可以在这里提前同时生成或转换 PKCS12、JKS 不同格式的文件。
当然,这里非必须的步骤。也可以先跳过、直接进入下面的步骤8,等后续客户端需要用到时,再转换/生成 JKS、PKCS12 格式文件。
数字证书是公钥的载体,而密钥库可以包含公钥、私钥信息。JKS 和 PKCS12 都是比较常用的两种密钥库格式/标准。
JKS 文件:Java Key Store 密钥库文件。搞Java开发、尤其是接触过 HTTPS 平台的同学并不陌生。
JKS 文件是通过 Java 原生工具 keytool 创建或者转换其他格式证书文件而生成,通常命名为 *.jks 或 *.keystore(与扩展名无关、仅标识而已)。
有些软件SSL使用时会将 crt 和 key 分开两个文件单独存放,而 Java 应用则将他们存在一个 *.jks 或 *.keystore 文件中,再设置一个提取信息的密码。
Java8(及以前的版本)中默认的 keystore 类型是 JKS,即如果您在使用 keytool 创建 keystore 时没有指定 -storetype,那么 keystore 格式将为JKS。
Java9(及以后的版本)中默认的 密钥库类型将更改为 PKCS12,因为它与 JKS 相比具有增强的兼容性。
PKCS12 文件:通常为 *.p12 或 *.pfx。它是通过 openssl 命令生成的。
PKCS12 文件是通过 openssl 生成的。通常命名为 *.pfx 或 *.p12。使用 DRE 格式编码(二进制内容)。
有些软件SSL使用时会将 crt 和 key 分开两个文件单独存放,而 Windows IIS 则将他们存在一个 *.pfx 或 *.p12 文件中,再设置一个提取信息的密码。
JKS 和 PKCS12 这两种格式的文件可以通过导入/导出的方式进行转换,Java keytool 工具可以将其进行转换。
keytool 命令参数:
-importkeystore 导入密钥库。通过格式设置,可以将 PKCS12文件转换为JKS格式。
-v 显示详情。
-srckeystore 源密钥库文件。
-srcstoretype 源密钥库格式。
-srcstorepass 源密钥库密码。
-destkeystore 目标密钥库文件。
-deststoretype 目标密钥库格式:JKS 或 PKCS12(如果不设置该参数,默认是JKS)
-deststorepass 目标密钥库密码,设置目标秘钥库访问密码。
生成 PKCS12 格式的文件(含证书和私钥):
执行 openssl 命令将 RSA 私钥转 PKCS12 格式的文件(转换时会提示设置一个转换后的目标私钥库的密码):
执行时会提示设置密码,我设置为 1q2w3e。-name client1 我设置了别名(Alias name)为 client1。
生成的 client1.p12 文件中会包含 证书 和 私钥 两部分内容:
openssl pkcs12 -export -in client1.crt -inkey client1.key -name client1 -out client1.p12
生成 JKS 格式的文件(含证书和私钥、给Java客户端使用):
keytool 实现 PKCS12 转 JKS:
keytool -importkeystore -v -srckeystore client1.p12 -srcstoretype pkcs12 -srcstorepass 1q2w3e -destkeystore client1.keystore -deststoretype jks -deststorepass 1q2w3e
查看keystore中的证书信息:
keytool -list -v -keystore client1.keystore
keytool 也能支持将 JKS 转 PKCS12,如果有人提供了 JSK 密钥库文件,需要转 PKCS12 格式化的话,可以用 keytool 转换:
keytool -importkeystore -v -srckeystore client1.keystore -srcstoretype jks -srcstorepass 1q2w3e -destkeystore client1.p12 -deststoretype pkcs12 -deststorepass 1q2w3e
8)证书目录下证书文件生成完毕以后、重新进行一下授权:
chown -R clickhouse:clickhouse /var/lib/clickhouse/certs
查看证书目录文件列表:
root@6fa485afcbf4:/var/lib/clickhouse/certs# ls -l
total 48
-rw-r--r-- 1 clickhouse clickhouse 1074 Oct 31 11:25 ca.crt
-rw-r--r-- 1 clickhouse clickhouse 1675 Oct 31 11:25 ca.key
-rw-r--r-- 1 clickhouse clickhouse 17 Oct 31 11:31 ca.srl
-rw-r--r-- 1 clickhouse clickhouse 973 Oct 31 11:26 chnode1.crt
-rw-r--r-- 1 clickhouse clickhouse 899 Oct 31 11:25 chnode1.csr
-rw-r--r-- 1 clickhouse clickhouse 1704 Oct 31 11:25 chnode1.key
-rw-r--r-- 1 clickhouse clickhouse 973 Oct 31 11:31 client1.crt
-rw-r--r-- 1 clickhouse clickhouse 899 Oct 31 11:31 client1.csr
-rw-r--r-- 1 clickhouse clickhouse 1704 Oct 31 11:31 client1.key
-rw-r--r-- 1 clickhouse clickhouse 2032 Oct 31 11:32 client1.keystore
-rw-r--r-- 1 clickhouse clickhouse 2340 Oct 31 11:32 client1.p12
-rw-r--r-- 1 clickhouse clickhouse 812 Oct 31 11:27 truststore
证书和秘钥创建完毕、记下来就是修改ClickHouse服务器配置、开启SSL。
9)ClickHouse Server 配置修改开启SSL:
ClickHouse集群环境开启SSL的配置修改,可以参考官方的文档(4、5章节有详细介绍):https://clickhouse.ac.cn/docs/en/guides/sre/configuring-ssl
我的docker环境的ClickHouse单节点的配置修改如下:
修改ClickHouse配置文件 config.xml 、使用SSL证书:
vim /etc/clickhouse-server/config.xml
如果docker内没有vi或vim命令,则退出到宿主机上修改挂载目录下的对应配置文件:
vim /data/clickhouse/conf/config.xml
修改<openSSL></openSSL>的配置如下:
<openSSL>
<server>
<certificateFile>/var/lib/clickhouse/certs/chnode1.crt</certificateFile>
<privateKeyFile>/var/lib/clickhouse/certs/chnode1.key</privateKeyFile>
<verificationMode>relaxed</verificationMode>
<loadDefaultCAFile>false</loadDefaultCAFile>
<caConfig>/var/lib/clickhouse/certs/ca.crt</caConfig>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
</server>
</openSSL>
如果是集群节点,每个节点配置时填写各自对应的证书文件路径。
注意:
如果本节点还需要作为 Client 执行 ClickHouse CLI 登录访问 ClickHouse Server 的话,如果要使用 SSL 方式访问(非SSL方式访问、无需修改配置),
则需要配置 /etc/clickhouse-client/config.xml 中的 <client></client> 配置,指定客户端证书文件路径。
如果无需使用 ClickHouse CLI SSL 访问数据库、则无需修改客户端的 <client></client> 配置。
clickhouse-client 客户端的配置文件可以通过 --config-file 来指定,如果不指定则使用默认配置文件 /etc/clickhouse-client/config.xml 。
vim /etc/clickhouse-client/config.xml
如果docker 未提供vi命令的话,也可以宿主机执行
vim /data/clickhouse/client-conf/config.xml
<openSSL>
<client> <!-- Used for connection to server's secure tcp port -->
<loadDefaultCAFile>false</loadDefaultCAFile>
<caConfig>/var/lib/clickhouse/certs/ca.crt</caConfig>
<certificateFile>/var/lib/clickhouse/certs/client1.crt</certificateFile>
<privateKeyFile>/var/lib/clickhouse/certs/client1.key</privateKeyFile>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
<!-- Use for self-signed: <verificationMode>none</verificationMode> -->
<invalidCertificateHandler>
<!-- Use for self-signed: <name>AcceptCertificateHandler</name> -->
<name>RejectCertificateHandler</name>
</invalidCertificateHandler>
</client>
</openSSL>
10)继续修改 config.xml、在每个节点上配置用于 SSL 的 gRPC:
<grpc>
<enable_ssl>1</enable_ssl>
<!-- The following two files are used only if enable_ssl=1 -->
<ssl_cert_file>/var/lib/clickhouse/certs/chnode1.crt</ssl_cert_file>
<ssl_key_file>/var/lib/clickhouse/certs/chnode1.key</ssl_key_file>
<!-- Whether server will request client for a certificate -->
<ssl_require_client_auth>true</ssl_require_client_auth>
<!-- The following file is used only if ssl_require_client_auth=1 -->
<ssl_ca_cert_file>/var/lib/clickhouse/certs/ca.crt</ssl_ca_cert_file>
<!-- Default compression algorithm (applied if client doesn't specify another algorithm).
Supported algorithms: none, deflate, gzip, stream_gzip -->
<compression>deflate</compression>
<!-- Default compression level (applied if client doesn't specify another level).
Supported levels: none, low, medium, high -->
<compression_level>medium</compression_level>
<!-- Send/receive message size limits in bytes. -1 means unlimited -->
<max_send_message_size>-1</max_send_message_size>
<max_receive_message_size>-1</max_receive_message_size>
<!-- Enable if you want very detailed logs -->
<verbose_logs>false</verbose_logs>
</grpc>
11)修改 config.xml 、开启 ssl 相关端口:
开启 https 端口、取消注释:
<https_port>8443</https_port>
开启 ClickHouse Native 安全 TCP 端口、取消注释:
<tcp_port_secure>9440</tcp_port_secure>
开启 interserver https 端口、取消注释:
<interserver_https_port>9010</interserver_https_port>
12)重启服务
docker环境,直接重启容器:
docker stop clickhouse-server
docker start clickhouse-server
如果非容器环境,执行重启ClickHouse服务命令:service clickhouse-server restart
13)连接测试
a)使用 ClickHouse CLI 连接数据库
clickhouse-client 命令行连接工具使用介绍、可参考官方资料(Command-Line Client):
https://clickhouse.com/docs/en/interfaces/cli#clickhouse-client
非SSL连接:
clickhouse-client --host 127.0.0.1 --port 9000 --user root --password <PASSWORD>
SSL连接:
clickhouse-client --host 127.0.0.1 --port 9440 --user root --password <PASSWORD> --secure
clickhouse-client --host 127.0.0.1 --port 9440 --user root --password <PASSWORD> --secure --query "show tables"
注意:如果客户端配置文件中的<client></client>配置的CA证书有误(配置指定的不是签发所用的对应CA证书,例如:使用了默认证书或者其他CA证书),则会因为证书校验失败而连接失败,报错如下:
Code: 210. DB::NetException: SSL Exception: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED (127.0.0.1:9440)
注意:
> clickhouse-cli 工具 connect to ClickHouse with native TCP。因此,连接时需要指定 native TCP 端口(默认TCP非安全端口是 9000、默认TCP安全端口是9440)。
> 如果不指定数据库默认为default数据内裤、如果不指定用户名默认为default用户。
> --config-file : 可指定配置文件,如果不指定、则默认使用客户端配置文件 /etc/clickhouse-client/config.xml
> clickhouse-client 工具的主要参数(更多参数,参考官方介绍 https://clickhouse.com/docs/en/interfaces/cli#clickhouse-client):
--host, -h – The server name, ‘localhost’ by default. You can use either the name or the IPv4 or IPv6 address.
--port – The port to connect to. Default value: 9000. Note that the HTTP interface and the native interface use different ports.
--user, -u – The username. Default value: default.
--password – The password. Default value: empty string.
--ask-password - Prompt the user to enter a password.
--query, -q – The query to process when using non-interactive mode. --query can be specified multiple times, e.g. --query "SELECT 1" --query "SELECT 2". Cannot be used simultaneously with --queries-file.
--database, -d – Select the current default database. Default value: the current database from the server settings (‘default’ by default).
--config-file – The name of the configuration file.
--secure – If specified, will connect to server over secure connection (TLS). You might need to configure your CA certificates in the configuration file. The available configuration settings are the same as for server-side TLS configuration.
进入容器操作、ClickHouse容器内默认携带了 clickhouse-client 命令
docker exec -it clickhouse-server /bin/bash
i)ClickHouse CLI tcp 非安全端口(9000)连接
注意:ClickHouse CLI 通过TCP非安全端口连接时,对SSL配置无要求。
clickhouse-client --host 127.0.0.1 --port 9000 --user root --password 1q2w3e
clickhouse-client --host 127.0.0.1 --port 9000 --user root --password 1q2w3e --query "show tables"
root@39f30b0a4934:/# clickhouse-client --host 127.0.0.1 --port 9000 --user root --password 1q2w3e
ClickHouse client version 21.8.13.6 (official build).
Connecting to 127.0.0.1:9000 as user root.
Connected to ClickHouse server version 21.8.13 revision 54449.
clickhouse :) select version();
SELECT version()
Query id: f560fc43-b5f0-469f-b9ef-295416b76138
┌─version()─┐
│ 21.8.13.6 │
└───────────┘
1 rows in set. Elapsed: 0.003 sec.
clickhouse :)
ii)ClickHouse CLI tcp 安全端口(9440)连接
clickhouse-client --host 127.0.0.1 --port 9440 --user root --password 1q2w3e --secure
clickhouse-client --host 127.0.0.1 --port 9440 --user root --password 1q2w3e --secure --query "show tables"
客户端配置文件 /etc/clickhouse-client/config.xml 中配置了CA证书、客户端证书、客户端秘钥,SSL连接成功
root@6fa485afcbf4:/# clickhouse-client --host 127.0.0.1 --port 9440 --user root --password 1q2w3e --secure
ClickHouse client version 21.8.13.6 (official build).
Connecting to 127.0.0.1:9440 as user root.
Connected to ClickHouse server version 21.8.13 revision 54449.
clickhouse :) select version();
SELECT version()
Query id: de89fbbb-cd2e-482a-a1c0-88bdc565da27
┌─version()─┐
│ 21.8.13.6 │
└───────────┘
1 rows in set. Elapsed: 0.002 sec.
clickhouse :)
iii)ClickHouse CLI tcp 安全端口(9440)连接
clickhouse-client --host 127.0.0.1 --port 9440 --user root --password 1q2w3e --secure
clickhouse-client --host 127.0.0.1 --port 9440 --user root --password 1q2w3e --secure --query "show tables"
客户端配置文件 /etc/clickhouse-client/config.xml 中只配置CA证书,不配置(注释掉)客户端证书和客户端秘钥,SSL连接成功
iv)ClickHouse CLI tcp 安全端口(9440)连接
clickhouse-client --host 127.0.0.1 --port 9440 --user root --password 1q2w3e --secure
clickhouse-client --host 127.0.0.1 --port 9440 --user root --password 1q2w3e --secure --query "show tables"
客户端配置文件 /etc/clickhouse-client/config.xml 中不配配置CA证书、客户端证书和客户端秘钥(三个配置项全部注释掉),SSL连接失败:
Code: 210. DB::NetException: SSL Exception: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED (127.0.0.1:9440)
vi)ClickHouse CLI tcp 安全端口(9440)连接
clickhouse-client --host 127.0.0.1 --port 9440 --user root --password 1q2w3e --secure --config-file=/var/lib/clickhouse/config_invalid_crt.xml
客户端配置文件 --config-file=/var/lib/clickhouse/config_invalid_crt.xml 指定配置文件、配置文件中配置了CA(正确的)、客户端私钥 和 客户端证书。
只有CA是正确的,客户端私钥和客户端证书为非法(其他环境生成的客户端证书)。
满足预期、连接失败:Code: 210. DB::NetException: SSL Exception: error:10000418:SSL routines:OPENSSL_internal:TLSV1_ALERT_UNKNOWN_CA, while reading from socket (127.0.0.1:9440)
b)使用第三方客户端工具连接数据库
DBeaver 客户端连接数据库,测试普通连接(http)和SSL安全连接(https)
ClickHouse 官方有介绍 DBeaver 客户端 SSL 连接的配置:https://clickhouse.com/docs/en/integrations/dbeaver
JDBC 连接 8123 (http)端口,URL:
jdbc:clickhouse://192.168.100.250:8123/default
连接成功
JDBC 连接 8443 (https/SSL)安全端口,URL:
jdbc:clickhouse://192.168.100.250:8443/default?ssl=true&sslmode=none
ssl=true&sslmode=none、Client证书未配置:SSL连接成功。
JDBC 连接 8443 (https/SSL)安全端口,URL:
jdbc:clickhouse://192.168.100.250:8443/default?ssl=true&sslmode=strict
ssl=true&sslmode=strict、只配置CA证书,Client证书&秘钥未配置,用IP:SSL连接失败。报错:doesn't match any of the subject alternative names
JDBC 连接 8443 (https/SSL)安全端口,URL:
jdbc:clickhouse://chnode1.mytest01.com:8443/default?ssl=true&sslmode=strict
ssl=true&sslmode=strict(连接驱动属性中配置、URL中不指定?参数)、只配置CA证书(连接驱动属性中配置),Client证书&秘钥未配置,用域名:SSL连接成功。
注意:要修改/etc/hosts。
改成用域名访问:
修改 c:\Windows\System32\drivers\etc\
添加:
192.168.100.250 chnode1.mytest01.com
继续测试:尝试客户单指定CA证书、客户端证书和秘钥的方式连接:
把证书拷贝到本地电脑 && dbeaver 配置指定ssl证书文件。
注意:如果用DBeaver客户端以SSL方式访问数据库的话,由于步骤7)中生成的客户端私钥是RSA格式的,而 clickhouse-jdbc 需要的客户端私钥格式是 PKCS 8,因此需要将生成的 client1.key 转换成 PKCS 8 格式的私钥。
jdbc:clickhouse://chnode1.mytest01.com:8443/default?ssl=true&sslmode=strict
ssl=true&sslmode=strict(连接驱动属性中配置、URL中不指定?参数)、配置CA证书、Client证书和秘钥(连接驱动属性中配置),用域名:SSL连接失败,报错如下:
Code: 516, e.displayText() = DB::Exception: root: Authentication failed: password is incorrect or there is no user with such name (version 21.8.13.6 (official build))
网上有人说是DBeaver连接ClickHouse SSL需要的私钥格式是 PKCS8 格式,尝试生产 PKCS8 格式私钥文件:
RSA 私钥转 PKCS 8 格式的转换命令:
openssl pkcs8 -topk8 -inform PEM -in client1.key -outform PEM -nocrypt > client1.key.pkcs8
但连接还是报错。
原因不清楚。
c)Java 开发 Demo 进行JDBC连接测试:
String url = "jdbc:ch://chnode2.mytest01.com:8443/default";
Properties properties = new Properties();
properties.put("user", user);
properties.put("password", pwd);
properties.setProperty("ssl", "true");
properties.setProperty("sslmode", "strict"); // NONE to trust all servers; STRICT for trusted only
properties.setProperty("sslrootcert", "./ssl-cert-clickhouse/ca.crt"); //同时设置ca证书(ca.crt)、cert和JKS混用
properties.setProperty("key_store_type", "JKS");
properties.setProperty("trust_store", "./ssl-cert-clickhouse/client1.keystore"); //clickhouse/jdbc 实际当做 keystore 用
properties.setProperty("key_store_password", "1q2w3e");
Class.forName(this.driverClassName);
connection = DriverManager.getConnection(url, properties);
注意:ClickHouse JDBC SSL 参数和 传统数据库 例如 MySQL SSL 等提供的参数有比较大的差异。
1)官方介绍:https://clickhouse.com/docs/en/integrations/java/jdbc-driver
2)ClickHouse JDBC SSL 连接参数对于JKS类型的证书密钥库配置参数,提供了 trust_store、key_store_password,但没有提供 key_store 和 trust_store_password 参数。
3)ClickHouse JDBC SSL 连接参数 trust_store 实际是被 ClickHouse/JDBC 当做了 key_store 使用,因此需要传 key_store 配置文件路径、而不是 trust_store 文件路径。
4)ClickHouse JDBC SSL 连接参数 key_store_password 是 key_store 的文件密码。
5)ClickHouse JDBC SSL 连接参数,有两种设置方式:
方式1)Java系统Properties属性设置方式:
System.setProperty("javax.net.ssl.keyStore", keyStoreFile);
System.setProperty("javax.net.ssl.keyStorePassword", keyStorePwd);
System.setProperty("javax.net.ssl.trustStore", trustStoreFile);
System.setProperty("javax.net.ssl.trustStorePassword", trustStorePwd);
String url = "jdbc:ch://chnode1.mytest01.com:8443/default";
Properties properties = new Properties();
properties.put("user", user);
properties.put("password", pwd);
properties.setProperty("ssl", "true");
properties.setProperty("sslmode", "strict");
Class.forName("com.clickhouse.jdbc.ClickHouseDriver");
connection = DriverManager.getConnection(url, properties);
Statement st = connection.createStatement();
ResultSet rs = st.executeQuery("SELECT version()");
...
方式2)连接级Properteis参数设置方式:
String url = "jdbc:ch://chnode1.mytest01.com:8443/default";
Properties properties = new Properties();
properties.put("user", user);
properties.put("password", pwd);
properties.setProperty("ssl", "true");
properties.setProperty("sslmode", "strict"); // NONE to trust all servers; STRICT for trusted only
properties.setProperty("sslrootcert", "./ssl-cert-clickhouse/ca.crt"); //同时设置ca证书(ca.crt),JDBC连接参数没有提供JKS格式的truststore文件和truststore密码参数
properties.setProperty("key_store_type", "JKS");
properties.setProperty("trust_store", "./ssl-cert-clickhouse/client1.keystore"); //clickhouse jdbc 的 trust_store 参数实际要传 keystore
properties.setProperty("key_store_password", "1q2w3e"); //keystore密码
Class.forName("com.clickhouse.jdbc.ClickHouseDriver");
connection = DriverManager.getConnection(url, properties);
Statement st = connection.createStatement();
ResultSet rs = st.executeQuery("SELECT version()");
...
客户端的不同配置测试如下:
ssl=true&sslmode=none: 无需证书,连接成功
ssl=true&sslmode=strict:配置CA证书、不配客户端证书&私钥,连接成功;
ssl=true&sslmode=strict:配置CA证书、配置Client证书&私钥(crt&key),连接失败,Java应用需要用JKS证书秘钥文件;
ssl=true&sslmode=strict:配置CA证书、配置JKS格式的Client证书密钥库文件 keystore(trust_store=keystore文件路径,ClickHouse trust_store 参数对应的是 keystore 文件)、配置 keystore 密码(key_store_password参数),连接成功;
ssl=true&sslmode=strict:不配CA证书、不配客户端证书&私钥,连接失败。如果是CA签发证书的话,理论上不配CA证书应该能连成功。自签发证书必须配置CA证书。
4.附录
1)SSL证书的几种类型
单域名SSL证书
标准SSL证书,保护一个明确的域名,例如:www.mytest01.com。
通配符SSL证书
Wildcard Certificates 也叫泛域名SSL证书。单个证书可以保护一个主域名(例如:mytest01.com)以及其所有的二级子域名(例如:www.mytest01.com、mail.mytest01.com 等),不限制子域名数量,但不能保护该主域名下的三级子域名(例如:shop.mail.mytest01.com)。通配符SSL证书可以保护通用域名和您在提交申请时指定的级别下的所有子域。只需在通用域名左侧的子域区域添加星号 (*) 即可。泛域名SSL证书只能保护同一级别的多个子域。
多域名SSL证书
SAN SSL证书。单个证书可以跨多个主域名、多个子域名提供安全保护。只要这些域名属于同一主体,就可申请一张多域名证书管理多个主域名和多个子域名网站。一般而言,多域名证书默认保护3个域名、超过默认域名数量,可支持付费增加。
多域名通配符SSL证书
SAN SSL证书。一张证书保护一个主域名和多个其二级子域名,对同级子域名数量无限制,新增子域名也无需额外付费。多域名证书集泛域名SSL和多域名SSL证书的优点于一身,一张SSL证书上可绑定多个通配符主域名,例如:*.mytest01.com; *.mytest02.cn; *.mytest03.com等。
2)单域名SSL证书生成
rm -rf ca.* truststore chnode*.* client*.* #CA证书生成
openssl genrsa -out ca.key 2048
openssl req -x509 -subj "/C=CN/ST=ZJ/L=HZ/O=mytest01/OU=RD/CN=ca" -nodes -key ca.key -days 3650 -out ca.crt
keytool -importcert -alias ca -file ca.crt -keystore truststore -storepass 1q2w3e #生成 jks 格式的 truststore(如果需要)#Server证书秘钥生成
openssl req -newkey rsa:2048 -nodes -subj "/C=CN/ST=ZJ/L=HZ/O=mytest01/OU=RD/CN=chnode1.mytest01.com" -keyout chnode1.key -out chnode1.csr
openssl x509 -req -in chnode1.csr -out chnode1.crt -CA ca.crt -CAkey ca.key -days 3650 -CAcreateserial#Client证书秘钥对生成
openssl req -newkey rsa:2048 -nodes -subj "/C=CN/ST=ZJ/L=HZ/O=mytest01/OU=RD/CN=client1.mytest01.com" -keyout client1.key -out client1.csr
openssl x509 -req -in client1.csr -out client1.crt -CA ca.crt -CAkey ca.key -days 3650
openssl pkcs8 -topk8 -inform PEM -in client1.key -outform PEM -nocrypt -out client1.p8 #生成 PCKS#8 格式的 Client 证书(如果需要)
openssl pkcs12 -export -in client1.crt -inkey client1.key -name client1 -out client1.p12 #生成 PCKS#12 格式的 Client 证书(如果需要)
keytool -importkeystore -v -srckeystore client1.p12 -srcstoretype pkcs12 -srcstorepass 1q2w3e -destkeystore client1.keystore -deststoretype jks -deststorepass 1q2w3e #生成 jks 格式的 keystore(如果需要)#查看证书、测试/校验证书
openssl x509 -in ca.crt -text #查看CA证书详细信息
keytool -list -v -keystore truststore #查看JKS格式的truststore证书详细信息openssl x509 -in chnode1.crt -noout -text #查看Server证书详细信息(包括公钥)
openssl rsa -in chnode1.key -text #查看Server私钥文件中的私钥信息
openssl verify -CAfile ca.crt chnode1.crt #测试/校验证书openssl x509 -in client1.crt -noout -text #查看Client证书详细信息(包括公钥)
openssl rsa -in client1.key -text #查看Client私钥文件中的私钥信息
openssl verify -CAfile ca.crt client1.crt #检查新生成的客户端证书是否已针对 CA 证书进行验证(通过)keytool -list -v -keystore client1.keystore #查看JKS格式的keystore证书详细信息#文件权限授权
chown -R clickhouse:clickhouse /var/lib/clickhouse/certs#证书生成(或修改替换)以后,确认配置数据库使用正确后、需要重启数据库(docker环境则重启容器),生效配置:
docker stop clickhouse-server
docker start clickhouse-server
#SSL连接测试
docker exec -it clickhouse-server /bin/bash
clickhouse-client --user root --password 1q2w3e --port 9440 --secure --host 127.0.0.1 --query "select version()"
clickhouse-client --user root --password 1q2w3e --port 9440 --secure --host 127.0.0.1 --query "show tables"#如果远程访问通过域名访问,别忘了配置本地DNS或者修改主机hosts
echo '192.168.100.250 chnode1.mytest01.com chnode2.mytest01.com chnode3.mytest02.com' >> /etc/hosts
------------------------------------------------------------
3)通配符SSL证书(泛域名SSL证书)生成
rm -rf ca.* truststore chnode*.* client*.* #CA证书生成
openssl genrsa -out ca.key 2048
openssl req -x509 -subj "/C=CN/ST=ZJ/L=HZ/O=mytest01/OU=RD/CN=ca" -nodes -key ca.key -days 3650 -out ca.crt
keytool -importcert -alias ca -file ca.crt -keystore truststore -storepass 1q2w3e #生成 jks 格式的 truststore(如果需要)#Server证书秘钥生成
openssl req -newkey rsa:2048 -nodes -subj "/CN=*.mytest01.com" -keyout chnode1.key -out chnode1.csr
openssl x509 -req -in chnode1.csr -out chnode1.crt -CA ca.crt -CAkey ca.key -days 3650 -CAcreateserial#Client证书秘钥对生成
openssl req -newkey rsa:2048 -nodes -subj "/C=CN/ST=ZJ/L=HZ/O=mytest01/OU=RD/CN=*.mytest01.com" -keyout client1.key -out client1.csr
openssl x509 -req -in client1.csr -out client1.crt -CA ca.crt -CAkey ca.key -days 3650
openssl pkcs8 -topk8 -inform PEM -in client1.key -outform PEM -nocrypt -out client1.p8 #生成 PCKS#8 格式的 Client 证书(如果需要)
openssl pkcs12 -export -in client1.crt -inkey client1.key -name client1 -out client1.p12 #生成 PCKS#12 格式的 Client 证书(如果需要)
keytool -importkeystore -v -srckeystore client1.p12 -srcstoretype pkcs12 -srcstorepass 1q2w3e -destkeystore client1.keystore -deststoretype jks -deststorepass 1q2w3e #生成 jks 格式的 keystore(如果需要)#查看证书、测试/校验证书
openssl x509 -in ca.crt -text #查看CA证书详细信息
keytool -list -v -keystore truststore #查看JKS格式的truststore证书详细信息openssl x509 -in chnode1.crt -noout -text #查看Server证书详细信息(包括公钥)
openssl rsa -in chnode1.key -text #查看Server私钥文件中的私钥信息
openssl verify -CAfile ca.crt chnode1.crt #测试/校验证书openssl x509 -in client1.crt -noout -text #查看Client证书详细信息(包括公钥)
openssl rsa -in client1.key -text #查看Client私钥文件中的私钥信息
openssl verify -CAfile ca.crt client1.crt #检查新生成的客户端证书是否已针对 CA 证书进行验证(通过)keytool -list -v -keystore client1.keystore #查看JKS格式的keystore证书详细信息#文件权限授权
chown -R clickhouse:clickhouse /var/lib/clickhouse/certs#证书生成(或修改替换)以后,确认配置数据库使用正确后、需要重启数据库(docker环境则重启容器),生效配置:
docker stop clickhouse-server
docker start clickhouse-server
#SSL连接测试
docker exec -it clickhouse-server /bin/bash
clickhouse-client --user root --password 1q2w3e --port 9440 --secure --host 127.0.0.1 --query "select version()"
clickhouse-client --user root --password 1q2w3e --port 9440 --secure --host 127.0.0.1 --query "show tables"#如果远程访问通过域名访问,别忘了配置本地DNS或者修改主机hosts
echo '192.168.100.250 chnode1.mytest01.com chnode2.mytest01.com chnode3.mytest02.com' >> /etc/hosts
4)多域名通配符SSL证书(配置了 SAN)生成
rm -rf ca.* truststore chnode*.* client*.* #CA证书生成
openssl genrsa -out ca.key 2048
openssl req -x509 -subj "/C=CN/ST=ZJ/L=HZ/O=mytest01/OU=RD/CN=ca" -nodes -key ca.key -days 3650 -out ca.crt
keytool -importcert -alias ca -file ca.crt -keystore truststore -storepass 1q2w3e #生成 jks 格式的 truststore(如果需要)#Server证书秘钥生成
openssl req -newkey rsa:2048 -nodes \-subj "/C=CN/ST=ZJ/L=HZ/O=mytest01/OU=RD/CN=*.mytest01.com" \-reqexts SAN \-config <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:localhost,DNS:*.mytest01.com,DNS:*.mytest02.com")) \-keyout chnode1.key -out chnode1.csropenssl x509 -req -in chnode1.csr -out chnode1.crt -CA ca.crt -CAkey ca.key -days 3650 -CAcreateserial -extensions SAN -extfile <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:localhost,DNS:*.mytest01.com,DNS:*.mytest02.com"))#注意 openssl.cnf 位置可能因为系统不同而不同,Centos7: /etc/pki/tls/openssl.cnf 其他有的系统可能是: /etc/ssl/openssl.cnf#Client证书秘钥对生成
openssl req -newkey rsa:2048 -nodes \-subj "/C=CN/ST=ZJ/L=HZ/O=mytest01/OU=RD/CN=*.mytest01.com" \-reqexts SAN \-config <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:localhost,DNS:*.mytest01.com,DNS:*.mytest02.com")) \-keyout client1.key -out client1.csropenssl x509 -req -in client1.csr -out client1.crt -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 \-extensions SAN \-extfile <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:localhost,DNS:*.mytest01.com,DNS:*.mytest02.com"))#注意 openssl.cnf 位置可能因为系统不同而不同,Centos7: /etc/pki/tls/openssl.cnf 其他有的系统可能是: /etc/ssl/openssl.cnfopenssl pkcs8 -topk8 -inform PEM -in client1.key -outform PEM -nocrypt -out client1.p8 #生成 PCKS#8 格式的 Client 证书(如果需要)
openssl pkcs12 -export -in client1.crt -inkey client1.key -name client1 -out client1.p12 #生成 PCKS#12 格式的 Client 证书(如果需要)
keytool -importkeystore -v -srckeystore client1.p12 -srcstoretype pkcs12 -srcstorepass 1q2w3e -destkeystore client1.keystore -deststoretype jks -deststorepass 1q2w3e #生成 jks 格式的 keystore(如果需要)#查看证书、测试/校验证书
openssl x509 -in ca.crt -text #查看CA证书详细信息
keytool -list -v -keystore truststore #查看JKS格式的truststore证书详细信息openssl x509 -in chnode1.crt -noout -text #查看Server证书详细信息(包括公钥)
openssl rsa -in chnode1.key -text #查看Server私钥文件中的私钥信息
openssl verify -CAfile ca.crt chnode1.crt #测试/校验证书openssl x509 -in client1.crt -noout -text #查看Client证书详细信息(包括公钥)
openssl rsa -in client1.key -text #查看Client私钥文件中的私钥信息
openssl verify -CAfile ca.crt client1.crt #检查新生成的客户端证书是否已针对 CA 证书进行验证(通过)keytool -list -v -keystore client1.keystore #查看JKS格式的keystore证书详细信息#文件权限授权
chown -R clickhouse:clickhouse /var/lib/clickhouse/certs#证书生成(或修改替换)以后,确认配置数据库使用正确后、需要重启数据库(docker环境则重启容器),生效配置:
docker stop clickhouse-server
docker start clickhouse-server
#SSL连接测试
docker exec -it clickhouse-server /bin/bash
clickhouse-client --user root --password 1q2w3e --port 9440 --secure --host 127.0.0.1 --query "select version()"
clickhouse-client --user root --password 1q2w3e --port 9440 --secure --host 127.0.0.1 --query "show tables"#如果远程访问通过域名访问,别忘了配置本地DNS或者修改主机hosts
echo '192.168.100.250 chnode1.mytest01.com chnode2.mytest01.com chnode3.mytest02.com' >> /etc/hosts
5)Java 默认内置的根证书
#jdk8: %JAVA_HOME%/jire/lib/security
#jdk11:%JAVA_HOME%/lib/security/
#对应目录下Java会默认内置根证书密钥库文件 cacerts (JKS格式),默认密码为 changeit
#查看内置默认根证书的内容:keytool -list -v -keystore cacerts
#如果想要把自己生成的自签发CA证书导入进去,命令如下:
cp cacerts cacerts.back #修改前先备份一下
keytool -importcert -alias mytest02ClickHouseCA -file /opt/test/ssl-cert-clickhouse/ca.crt -keystore cacerts -storepass changeit #导入
keytool -list -v -alias mytest02ClickHouseCA -keystore cacerts #查看导入结果
keytool -delete -alias mytest02ClickHouseCA -keystore cacerts -storepass changeit #删除指定alias的证书
相关文章:

ClickHouse数据库SSL配置和SSL连接测试
目录 1.Server SSL配置介绍 2.Client SSL访问配置的介绍 3.my测试环境上开启ClickHouse Server SSL配置 & 客户端SSL访问的配置流程 4.附录 1)SSL证书的几种类型 单域名SSL证书 通配符SSL证书 多域名SSL证书 多域名通配符SSL证书 2)单域名…...

云渲染与汽车CGI图像技术优势和劣势
在数字时代,云渲染技术以其独特的优势在汽车CGI图像制作中占据了重要地位。云渲染通过利用云计算的分布式处理能力,将渲染任务分配给云端的服务器集群进行计算,从而实现高效、高质量的渲染效果。 这种技术的优势主要体现在以下几个方面&#…...
信号与噪声分析——第二节:随机变量的统计特征
2.1 单个随机变量的统计特征 随机变量是什么? 当随机变量X的取值个数是有限个的时候,我们称它为离散随机变量。 当随机变量X的取值个数是无限个的时候,我们称它为连续随机变量。 1. 分布函数和概率密度 1.分布函数 分布函数 定义为随机变…...

PHP网络爬虫常见的反爬策略
PHP网络爬虫在抓取数据时,常常会遭遇各种反爬策略。这些策略是网站为了保护自身数据不被恶意爬取而设置的。以下是一些常见的PHP网络爬虫反爬策略: IP限制: 这是最常见的反爬虫技术。通过限制IP的访问,可以有效防止恶意的爬虫攻击…...

java java.util.Scanner设置编码
在Java中,可以通过设置Scanner对象的编码来读取特定编码的输入。 使用Scanner的构造方法时,可以传入一个InputStream对象作为参数来设置编码。例如,如果要设置编码为UTF-8,可以这样写: InputStream inputStream Syst…...

小菜家教平台(二):基于SpringBoot+Vue打造一站式学习管理系统
目录 前言 今日进度 详细过程 一、数据库重构 二、编写登录接口 相关知识点 前言 昨天我们重启了小菜家教平台的开发,创建了新项目并初步进行了配置,今天我们继续。大家要是有需要源码的话可以在评论区跟我说,博客中就不添加源码了~ 今…...

Android AndroidManifest 文件内标签及属性
以下是重新排版后的文章: AndroidManifest 1. <manifest> 它是AndroidManifest.xml文件的根标签,包含了整个应用程序的基本信息,如应用程序的包名、版本代码、版本名称等。所有其他标签几乎都是在manifest标签内部定义的。 示例&…...

修改sql server 数据库的排序规则Chinese_PRC_CI_AS(字符集+排序)
文章目录 引言I 解决方案案例II 知识扩展排序规则SQL SERVER支持的所有排序规则引言 新增sql server 数据库实例的默认排序规则不支持中文存储,导致乱码 解决方案: 修改排序规则为Chinese_PRC_CI_AS 或者 Chinese_PRC_Stroke_CI_AS_WS或者Chinese_PRC_CI_AI_KS_WS 仅对新增…...

【ChatGPT】让ChatGPT在回答中附带参考文献与来源
让ChatGPT在回答中附带参考文献与来源 在撰写内容时,引用参考文献和来源可以增强信息的可信度和权威性。通过引导ChatGPT生成带有参考文献的回答,用户能够获取更可靠的信息和背景资料。本文将探讨如何有效地引导ChatGPT在回答中附带参考文献与来源。 一…...

云计算 在esxi 如何创建磁盘存储
重启启动...

大屏可视化:舞动数据与美观的“设计秘籍”
大屏可视化鉴赏:踏入软件系统产品设计之旅,让我们一同鉴赏那些闪耀在智慧农业、智慧园区、智慧社区及智慧港口等领域的大屏可视化杰作。每一帧画面,都是科技与创新的完美融合,数据跃然屏上,智慧触手可及。 >> 数…...

w~视觉~3D~合集1
我自己的原文哦~ https://blog.51cto.com/whaosoft/12316553 #SAFDNet 3D点云物体检测对自动驾驶感知至关重要,如何高效地从稀疏点云数据中学习特征表示是3D点云物体检测面临的一个关键挑战。我们在本文中将会介绍团队发表在NeurIPS 2023的HEDNet和CVPR 2024的SAFD…...

android 怎么查看依赖包的大小
Android 项目依赖包大小查看方案 在 Android 项目开发过程中,依赖包管理是一个非常重要的环节。了解每个依赖包的大小有助于我们优化应用性能,减少应用安装包的大小。本文将介绍一种方法来查看 Android 项目中各个依赖包的大小。 1. 环境准备 在开始之…...
HyperLogLog 的原理 详解
HyperLogLog(简称 HLL)是一种用于近似计数(特别是基数估计,Cardinality Estimation)的算法,它能够在大数据场景中高效地估计集合中不同元素的数量,尤其适用于数据流的情况。HyperLogLog 相较于传…...

OCR、语音识别与信息抽取:免费开源的AI平台在医疗领域的创新应用
一、系统概述 在医疗行业中,大量数据来自手写病历、医学影像报告、患者对话记录等非结构化数据源。这些数据常常存在信息碎片化和管理困难的问题,给医务人员的工作带来了不便。思通数科AI多模态能力平台正是为了解决这一行业痛点而生,产品集…...

苍穹外卖Bug集合
初始化后端项目运行出现以下问题 以上报错是因为maven和jdk版本不符合,需要将jdk改成17,mavne改成3.9.9...

小菜家教平台(一):基于SpringBoot+Vue打造一站式学习管理系统
前言 现在已经学习了很多与Java相关的知识,但是迟迟没有进行一个完整的实践(之前这个项目开发到一半,很多东西没学搁置了,同时原先的项目中也有很多的问题),所以现在准备从零开始做一个基于SpringBootVue的…...

PyCharm中pylint安装与使用
目录 1. 安装插件2. pycharm中使用该功能3. 命令行使用 1. 安装插件 然后重启 2. pycharm中使用该功能 3. 命令行使用 前提是先 pip install pylint pylint demo01.py下面红框内容的意思是,得到10分/ 满分10分,上次运行获得8.33分,经调整…...

一篇文章了解TCP/IP模型
TCP/IP模型,即传输控制协议/互联网协议模型(Transmission Control Protocol/Internet Protocol Model),是互联网及许多其他网络上使用的分层通信模型。以下是对TCP/IP模型的详细介绍: 一、定义与组成TCP/IP模型是一个四…...

python文字识别---基于百度api
百度智能云账户注册:https://console.bce.baidu.com/ai/#/ai/ocr/app/list 获取appid、api_key、secret_key from aip import AipOcr import osconfig {appid: 116122887,api_key: DAQnt...,secret_key: 5S0Kpyh.... }# 初始化 AipOcr 客户端 client AipOcr(c…...

linux下linuxdeployqt打包过程
一 、linuxdeployqt下载安装 1.下载linuxdeployqt依赖拷贝工具 下载地址:https://github.com/probonopd/linuxdeployqt/releases 2.为了方便使用,将名字改短一点:mv linuxdeployqt-6-x86_64.AppImage linuxdeployqt3.修改下载的文件的可执行…...

【拥抱AI】AI大模型在软件开发中的应用如何保证数据安全?
随着AI大模型在软件开发中的广泛应用,数据安全问题变得尤为重要。确保数据的安全不仅关乎企业的声誉和合规性,还直接影响到用户对产品的信任。以下是几种常见的方法和最佳实践,以确保在使用AI大模型时的数据安全。 1. 数据加密 传输加密&a…...

python爬取旅游攻略(1)
参考网址: https://blog.csdn.net/m0_61981943/article/details/131262987 导入相关库,用get请求方式请求网页方式: import requests import parsel import csv import time import random url fhttps://travel.qunar.com/travelbook/list.…...

C++网络编程之IO多路复用(一)
概述 在C网络编程中,处理并发连接是一个非常关键的核心问题。为了有效管理来自多个客户端的请求,服务器需要能够同时监听多个套接字上的事件,这通常通过IO多路复用来实现。 IO多路复用是一种工作机制,它可以让程序监视多个文件描述…...

vscode在windows和linux如何使用cmake构建项目并make生成可执行文件,两者有什么区别
vscode在windows和linux如何使用cmake构建项目并make生成可执行文件,两者有什么区别 windows默认使用的是最新的visual studio,而linux默认就是cmake 文章目录 vscode在windows和linux如何使用cmake构建项目并make生成可执行文件,两者有什么…...

Antd Vue中使用table组件把相同名称的合并单元格---只需两步
当前效果: 想要的效果: 第一步:在获取table数据的地方处理数据 function getTableList () {getDataList().then(res > {if (res.code 200 && res.data) {const list res.datalet columnIndex 0 //第一条数据let rowSpan …...

cmake中execute_process详解
execute_process 是 CMake 中一个非常强大的命令,用于在构建过程中执行外部程序或脚本。它提供了丰富的选项来控制执行过程,并可以捕获输出、错误和返回码。以下是 execute_process 的详细解析: 基本语法 execute_process(COMMAND <comm…...

搜维尔科技:使用Sensglove Nova2触觉反馈手套遥操作机器人操作
使用Sensglove Nova2触觉反馈手套遥操作机器人操作 搜维尔科技:使用Sensglove Nova2触觉反馈手套遥操作机器人操作...

企业HR如何选对一款智能招聘软件?
随着招聘市场的竞争加剧和求职者期望的提升,传统的招聘方式已经难以满足企业的需求。智能招聘软件应运而生,成为企业HR提升招聘效率、优化招聘流程、增强雇主品牌吸引力的关键工具。然而,市场上的智能招聘软件琳琅满目,如何选择一…...

任务中心全新升级,新增分享接口文档功能,MeterSphere开源持续测试工具v3.4版本发布
2024年11月5日,MeterSphere开源持续测试工具正式发布v3.4版本。 在这一版本中,系统设置方面,任务中心支持实时查看系统即时任务与系统后台任务;接口测试方面,新增接口文档分享功能、接口场景导入导出功能,…...