OpenSSL 作为 CA,无需接触 certs/crl/index/etc 环境

Posted

技术标签:

【中文标题】OpenSSL 作为 CA,无需接触 certs/crl/index/etc 环境【英文标题】:OpenSSL as a CA without touching the certs/crl/index/etc environment 【发布时间】:2011-12-07 18:57:12 【问题描述】:

我认为我有正确的 OpenSSL 命令来签署证书,但我卡住了,我发现的教程使用了不同的参数格式(我使用的是 OpenSSL 0.9.8o 2010 年 6 月 1 日)。

openssl ca -cert cert.pem -keyfile key.pem

(私钥未加密,CSR 在标准输入上。)

它给出了这个错误

Using configuration from /usr/lib/ssl/openssl.cnf
./demoCA/index.txt: No such file or directory
unable to open './demoCA/index.txt'

查看那个配置文件:

[ ca ]
default_ca = CA_default    # The default ca section

[ CA_default ]
dir      = ./demoCA        # Where everything is kept
certs    = $dir/certs      # Where the issued certs are kepp
crl_dir  = $dir/crl        # Where the issued crl are kept
database = $dir/index.txt  # database index file.

我没有任何设置。 我不想设置任何这些。

这是严格必要的,还是有“不打扰”选项?

我尝试创建空目录和文件,但遇到了麻烦。我真正想要的是像上面这样的命令能够工作,输出在标准输出上,而不用接触文件系统上的 anything

【问题讨论】:

我认为,如果您指定了最低要求,您可能会得到更好的响应,即您是否对任何提供 CA 证书和密钥可以签署客户端证书的解决方案感到满意,还是必须使用 @987654323 @? (并不是说我知道任何更好的答案) 如果不设置 CA 就无法使用 OpenSSL,否则你怎么能签署证书请求?你不会有 CA 来做到这一点。 ;-) 请记住,OpenSSL 会跟踪它看到的证书请求,以及它签署/撤销的证书等......所以这就是需要这些目录的原因(您可以使用这些路径的默认值)。 我接受这是 CA 的正常职责的一部分,但不履行这些职责的 异常 CA 不需要那些目录,对吧? @spraff:这取决于你所说的“CA”是什么意思,你可以通过与openssl ca 相同的过程而无需写入磁盘内容等等,这就是我问你的原因澄清什么将构成您的最小解决方案。 一个最小的解决方案将生成一个提交者可以使用的证书,该证书可以根据 ca 的根证书进行验证。 CA 根本不需要保留任何信息,而不是为了撤销或任何事情。 【参考方案1】:

我不知道任何“不打扰”选项,但您可以通过以下方式设置快速演示 CA:

#!/bin/bash
CAROOT=/path/to/ca
mkdir -p $CAROOT/ca.db.certs   # Signed certificates storage
touch $CAROOT/ca.db.index      # Index of signed certificates
echo 01 > $CAROOT/ca.db.serial # Next (sequential) serial number

# Configuration
cat>$CAROOT/ca.conf<<'EOF'
[ ca ]
default_ca = ca_default

[ ca_default ]
dir = REPLACE_LATER
certs = $dir
new_certs_dir = $dir/ca.db.certs
database = $dir/ca.db.index
serial = $dir/ca.db.serial
RANDFILE = $dir/ca.db.rand
certificate = $dir/ca.crt
private_key = $dir/ca.key
default_days = 365
default_crl_days = 30
default_md = md5
preserve = no
policy = generic_policy
[ generic_policy ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
EOF

sed -i "s|REPLACE_LATER|$CAROOT|" $CAROOT/ca.conf

cd $CAROOT

# Generate CA private key
openssl genrsa -out ca.key 1024

# Create Certificate Signing Request
openssl req -new -key ca.key  \
                 -out ca.csr       

# Create self-signed certificate
openssl x509 -req -days 10000 \
              -in ca.csr      \
              -out ca.crt     \
              -signkey ca.key

现在您可以生成和签署密钥了:

# Create private/public key pair
openssl genrsa -out server.key 1024

# Create Certificate Signing Request
openssl req -new -key server.key \
                 -out server.csr

# Sign key
openssl ca -config $CAROOT/ca.conf   \
           -in server.csr              \
           -cert $CAROOT/ca.crt      \
           -keyfile $CAROOT/ca.key   \
           -out server.crt

【讨论】:

这里是设置您自己的 CA (g-loaded.eu/2005/11/10/be-your-own-ca) 的操作指南,以及 OpenSSL 文档和 SSL 证书操作指南的链接。我很欣赏这不是您想要的答案,但我认为如果没有证书颁发机构(具有根证书设置),您将无法签署证书。尽管 SSL Certificates HOWTO 的第 2.3 节暗示了它可能是可能的,但并不完全是。 我想在这里表示感谢,因为在这个单一的解决方案中,我多年来遇到的 OpenSSL 问题的答案比我见过的任何其他单一资源都要多。谢谢!【参考方案2】:

基于snow6oy's answer,这是我所做的:

openssl x509 -req -CA CACert.pem -CAkey CAKey.pem -CAcreateserial -in YourCSR.csr -out YourCert.pem

几个可能有用的可选标志:

-days 1095 (默认为 30 天)

-sha256 (RHEL 7 默认为 SHA-1)

【讨论】:

【参考方案3】:

与其使用 ca 选项,不如尝试使用带有 -req 的 x509 选项。您将添加 -CAfile 以指向您的权限。这将签署您的证书而不向索引中添加条目。这里有更多关于使用 x509 作为“迷你 CA”的信息。

http://www.openssl.org/docs/apps/x509.html#SIGNING_OPTIONS

【讨论】:

x509 在大多数情况下都更容易使用。我今天(在 Windows 上)与 req 战斗了 8 或 9 个小时,然后我找到了你的答案并在 2 分钟内解决了它。 最好在命令中包含一个命令,而不是仅仅指向列出数百个命令行开关的文档。 尤其是现在的 404 页面

以上是关于OpenSSL 作为 CA,无需接触 certs/crl/index/etc 环境的主要内容,如果未能解决你的问题,请参考以下文章

CA实现

第八周学习作业

创建私有CA并发放证书

创建私有CA及dropbear的编译安装

创建私有CA及dropbear的编译安装

CA搭建与证书申请