当我们要把Nifi设置成加密模式时,我们需要为其提供keystore和truststore。如果我们想通过TLS身份验证访问Nifi的UI时,我们还需要生成一个客户端的PKCS12文件来导入浏览器中。以下简单介绍怎么用Java自带的keytool来生成以上所提及的文件。
生成Keystore
以下命令生成一个包含自签证书(self-signed certificate)的Java keystore:
keytool -genkey -keyalg RSA -alias nifi -keystore keystore.jks -keypass [password] -storepass [password] -validity 365 -keysize 4096 -dname "CN=[hostname], OU=nifi"
其中,替换[password]为你想设置的密码,替换[hostname]为你运行Nifi的机器的hostname。
这样,我们就生成了keystore.jks文件。该文件需要放置到Nifi当中。
生成PKCS12文件以及对应的Truststore
PKCS12文件是一种加密文件,一般用于存放证书以及对应的私钥。由于使用keytool无法直接生成PKCS12文件,我们首先生成一个包含自签证书的keystore(与上文生成Keystore的命令很相似):
keytool -genkey -keyalg RSA -alias client -keystore client_keystore.jks -keypass password -storepass password -validity 365 -keysize 4096 -dname "CN=user, OU=nifi"
这里,我们只是随便设置了一个密码password,因为这个Keystore只是一个过渡的产物,我们最后不会用到,所以随便设置一个就好。
接着我们把这个keystore转化成PKCS12文件:
keytool -importkeystore -srckeystore client_keystore.jks -destkeystore client.p12 -srcstoretype JKS -deststoretype PKCS12 -srcstorepass password -deststorepass [client_password] -destkeypass [client_password] -srcalias client -destalias client
其中,替换[client_password]为你想为PKCS12文件设置的密码。
除了生成PKCS12文件外,我们还需要生成一个信任PKCS12密匙文件中的证书的truststore。为此,我们先从之前的keystore中输出密匙的证书:
keytool -export -keystore client_keystore.jks -alias client -file client.der -storepass password
当我们得到证书以后,我们把这个证书引入到truststore.jks当中:
keytool -import -file client.der -alias client -keystore truststore.jks -storepass [truststore_password] -noprompt
其中,替换[truststore_password]为你想为truststore设置的密码。
这样,我们就生成了一个要放到Nifi当中的truststore.jks文件,以及需要导入到浏览器中的client.p12文件。
最后,为了安全起见,你应该删除掉client_keystore.jks以及client.der两个文件。
导入PKCS12文件
想要通过TLS身份验证方式访问Nifi UI,你必须先把生成的PKCS12文件导入到浏览器中。以Chrome为例,先进入设置 => 高级,找到 证书管理一项:
证书管理(Manage certificates)
点开该栏,会弹出以下窗口:
导入证书
点击导入,按照向导指引,选择你的client.p12文件,并输入该文件的密码就可以完成导入。然后你就可以通过浏览器访问加密的Nifi界面了。当被要求选择证书时,选择你添加的那项就可以了(如下图):
选择证书