如何利用OpenSSL从证书生成符合格式的known_host文件?
直接用OpenSSL没法生成,但结合shell工具可以一步搞定
OpenSSL本身没有内置参数直接输出你要的<hostname>:<port> <hex-string>格式,但你可以把OpenSSL的输出和简单的shell文本处理命令(比如sed)结合,一次性生成符合要求的known_hosts内容,不用手动修改。
单证书处理命令
假设你的服务器主机名是example.com,端口是22,证书路径为./server.crt,可以用下面的命令直接生成并追加到known_hosts文件:
# 替换成你的实际主机名、端口和证书路径 HOST="example.com" PORT="22" CERT_PATH="./server.crt" # 生成格式化后的指纹并写入文件 FINGERPRINT=$(openssl x509 -noout -in "$CERT_PATH" -fingerprint -sha256 | sed 's/SHA256 Fingerprint=//; s/://g') echo "$HOST:$PORT $FINGERPRINT" >> known_hosts
命令解释
openssl x509 ...:生成带冒号分隔的SHA256指纹,输出格式是SHA256 Fingerprint=AA:BB:CC:...sed 's/SHA256 Fingerprint=//; s/://g':先去掉前缀标识,再删除所有冒号,得到纯十六进制字符串echo ... >> known_hosts:把主机名+端口和指纹拼接成要求的格式,追加到目标文件
批量处理(可选)
如果要处理多个证书,对应不同的主机和端口,可以写个简单的shell循环:
# 示例:遍历证书文件,假设文件名格式为<hostname>-<port>.crt for cert in *.crt; do # 从文件名提取主机名和端口 HOST_PORT=$(basename "$cert" .crt) HOST=$(echo "$HOST_PORT" | cut -d'-' -f1) PORT=$(echo "$HOST_PORT" | cut -d'-' -f2) FINGERPRINT=$(openssl x509 -noout -in "$cert" -fingerprint -sha256 | sed 's/SHA256 Fingerprint=//; s/://g') echo "$HOST:$PORT $FINGERPRINT" >> known_hosts done
内容的提问来源于stack exchange,提问作者Stacker
相关产品推荐
相关产品推荐

