Kafka 配置 PKCS12 `ssl.keystore.location=user.p12` 而不访问本地文件系统

问题描述 投票:0回答:3

我可以使用以下客户端属性成功连接到受 SSL 保护的 Kafka 集群:

security.protocol=SSL
ssl.truststore.type=PKCS12
ssl.truststore.location=ca.p12
ssl.truststore.password=<redacted>
ssl.keystore.type=PKCS12
ssl.keystore.location=user.p12
ssl.keystore.password=<redacted>

但是,我正在编写一个在托管云环境中运行的 Java 应用程序,我无权访问文件系统。所以我不能只给它一个 .p12 文件的本地文件路径。

是否还有其他替代方案,例如使用从 S3、内存或 JVM 类路径资源加载?

具体来说,这是一个在 Amazon 的 Kinesis Analytics 托管 Flink 集群服务上运行的 Flink 应用程序。

java apache-kafka apache-flink kafka-consumer-api
3个回答
0
投票

当然,在将属性对象提供给 KafkaConsumer 之前,您可以从任何地方下载您想要的任何内容。但是,运行 Java 进程的用户将需要对本地文件系统进行一些访问才能下载文件。

我认为将文件打包为应用程序 JAR 的一部分更有意义,但是,我不知道有一种简单的方法来引用类路径资源,就好像它是常规文件系统路径一样。如果代码在 YARN 集群中运行,您也可以在提交时尝试使用

yarn.provided.lib.dirs
选项


0
投票

我暂时使用了一种解决方法,将您的证书上传到文件共享并创建您的应用程序,在初始化期间,从文件共享下载证书并将其保存到选择的位置,例如 /home/site/ca.p12,然后 kakfa 属性应该读取 ... ssl.truststore.location=/home/site/ca.p12 ...

这里有几行代码可以帮助您下载并保存证书。

// Create the Azure Files client.
    CloudFileClient fileClient = storageAccount.createCloudFileClient();
// Get a reference to the file share
    CloudFileShare share = fileClient.getShareReference("[SHARENAME]");
// Get a reference to the root directory for the share.
    CloudFileDirectory rootDir = share.getRootDirectoryReference();
// Get a reference to the directory where the file to be deleted is in
    CloudFileDirectory containerDir = rootDir.getDirectoryReference("[DIRECTORY]");
    CloudFile file = containerDir.getFileReference("[FILENAME]");
file.downloadToFile("/home/site/ca.p12");

0
投票

您可以使用备用设置动态提供文件,而无需将其转储到文件系统中。

ssl.truststore.证书

“ssl.truststore.type”指定格式的受信任证书。默认 SSL 引擎工厂仅支持带有 X.509 证书的 PEM 格式。

ssl.keystore.key

“ssl.keystore.type”指定格式的证书链。默认 SSL 引擎工厂仅支持带有 X.509 证书列表的 PEM 格式

例如,请参阅 https://cwiki.apache.org/confluence/display/KAFKA/KIP-651+-+Support+PEM+format+for+SSL+certificates+and+private+key#KIP651SupportPEMformatforSSLcertificatesandprivatekey- 中的示例提议的更改

ssl.keystore.certificate.chain=-----BEGIN CERTIFICATE----- \
MIIC4jCCAcqgAwIBAgIIJHw42Lu1+w8wDQYJKoZIhvcNAQEFBQAwJDEPMA0GA1UE \
AwwGY2xpZW50MREwDwYDVQQKDAhBIGNsaWVudDAeFw0yMDA4MDMwOTU4MTZaFw0y \
MDA5MDIwOTU4MTZaMCQxDzANBgNVBAMMBmNsaWVudDERMA8GA1UECgwIQSBjbGll \
bnQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCwTUf499MROpsz8LFr \
EOZEvUH6e1qks6AJEWjD7BY/SmwRijNPAaJhHaogYaVPrDEmFfexZDVhtc4eDkDI \
rW6+ZlkpNZupkINCR4R49f7JCjFz6rwGl4lSpa3mIhkXS/ZD0pjCYB9t2xBuTWVq \
ap40WqbQDsJHNH+9V/nzktX0ZOB6AgUuzFwLu3YDKS8XFD5TAdZKIu8rtxFzL1Uo \
HmiWFU9EoHROs23xJn7jCEOBq3L2b5IEE/ZHZVw/ooi/jJIID21bkiI731RWOoE3 \
ClEsh7CQHWlXwyoJmMP2dZrXbERpZclH0ozb5JJwJiMtB1uxUiD3wKF/rlcfRAcZ \
AR4vAgMBAAGjGDAWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQUF \
AAOCAQEAOqNAWknyUljdFeC/O5fDwoGYqHJY3dkinhjfiDEQm+RLLli64xjlNyRJ \
u4ZMHqEE4yQBnQGFxHkKIcA/poDgntSJrSFsfnpHzZJ5kz5zQdNDT9BYQIPWqoe2 \
0plNB6NjZeUn2OH+hAJIbclye0PXMrLwnDVUOJPS9xnlfgbrvIM0HCjtG95oeWv4 \
VLLOKaxiNYEX0xx9fT/lKjnqgi7OPAMTvfp5y1t4BCoe/43o8Pd0Ih2hdgVE6rLn \
mxEaTdlbQNp1ju70Ztl3NNt17+tceq0VbfTRI1xufTB5dCPWeeg0ekC9jMMs42R+ \
PiGYp7h8A3hRC5m8pYnKLSJp5ymITg== \
-----END CERTIFICATE-----
 
ssl.keystore.key=-----BEGIN ENCRYPTED PRIVATE KEY----- \
... \
-----END ENCRYPTED PRIVATE KEY--

当密钥未封装或静态时,这种提供密钥的方法更方便。

© www.soinside.com 2019 - 2024. All rights reserved.