【问题标题】:OpenSSL Self-signed Root CA certificate: Set a start dateOpenSSL 自签名根 CA 证书:设置开始日期
【发布时间】:2015-01-02 16:22:29
【问题描述】:

我正在使用以下设置(使用 OpenSSL 1.0.1 2012 年 3 月 14 日)创建一个带有自己的自签名证书的小测试 CA。我遇到的问题是,如果我查看 CA 自己证书的开始日期,它会为明天创建它(我今天想使用它)。

> openssl x509 -noout -startdate -enddate -in ~/my_little_ca/cacert.pem 
notBefore=Jan  2 16:05:52 2015 GMT
notAfter=Feb  1 16:05:52 2015 GMT

所以我挖了一点,因为我在使用 CA 签名的证书方面遇到了同样的问题。对于这些证书,我可以使用--startdate 设置开始日期,但我看不到 CA 根证书的类似选项。我尝试在生成 CA 时使用的 openssl 配置文件中使用 default_startdate,但由于某种原因似乎被忽略了?

我按如下方式创建 CA,基本上是从 Pravir Chandra 等人的“使用 OpenSSL 的网络安全”中逐字逐句摘录的,如下所示。

使用的命令是req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -verbose,但我想知道的是,在这种特殊情况下,在生成根 CA 证书和私钥时如何设置 startdate? 谢谢前进。

生成 CA 的完整脚本如下:

MYDIR=$(pwd -P)
BASEDIR=~/enigma_ca


mkdir -pv $BASEDIR
cd $BASEDIR

mkdir -pv private
chmod g-rwx,o-rwx private
mkdir -pv certs
touch index.txt
echo '01' > serial

DEFAULT_STARTDATE=$(date +'%y%m01000000Z')

cat <<EOF >openssl.cnf
[ ca ]
default_ca = my_test_ca

[ my_test_ca ]
certificate       = $BASEDIR/cacert.pem
database          = $BASEDIR/index.txt
new_certs_dir     = $BASEDIR/certs
private_key       = $BASEDIR/private/cakey.pem
serial            = $BASEDIR/serial

default_crl_days  = 7
default_days      = 356
default_md        = md5
default_startdate = $DEFAULT_STARTDATE

policy            = my_test_ca_policy
x509_extensions   = certificate_extensions

[ my_test_ca_policy ]
commonName              = supplied
stateOrProvinceName     = supplied
countryName             = supplied
emailAddress            = supplied
organizationName        = supplied
organizationalUnitName  = optional

[ certificate_extensions ]
basicConstraints  = CA:false

[ req ]
default_bits      = 2048
default_keyfile   = $BASEDIR/private/cakey.pem
default_md        = md5
default_startdate = $DEFAULT_STARTDATE
default_days      = 356

prompt              = no
distinguished_name  = root_ca_distinguished_name
x509_extensions     = root_ca_extensions

[ root_ca_distinguished_name ]
commonName           = My Mini CA
stateOrProvinceName  = Hampshire
countryName          = UK
emailAddress         = ca@myminica.com
organizationName     = My Mini CA Ltd

[ root_ca_extensions ]
basicConstraints = CA:true

EOF


OPENSSL_CONF=$BASEDIR/openssl.cnf
export OPENSSL_CONF

# Now generate self-signed certificate and generate key pair to go with it...
expect - <<EOF >> $MYDIR/ca_debug.txt
puts [concat "OPENSSL_CONF =" \$::env(OPENSSL_CONF)]
spawn openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -verbose
expect "PEM pass phrase:"
send "junk\r"
expect "PEM pass phrase:"
send "junk\r"
expect eof
EOF

【问题讨论】:

  • 请注意。 “default_md = md5”是安全漏洞。 sha256 会很好。

标签: ssl openssl


【解决方案1】:

您可以使用openssl ca-selfsign 选项来创建您的CA 自签名证书。 该命令允许设置特定的-startdate-enddate

例如:

  • 为您的 CA 创建私钥:

openssl genrsa -out cakey.pem 2048

  • 为此密钥创建 CSR:

openssl req -new -key cakey.pem -out ca.csr

  • 创建自签名证书

openssl ca -config openssl.cnf -selfsign -keyfile cakey.pem -startdate 20150214120000Z -enddate 20160214120000Z

【讨论】:

  • @Etienne 这些日期有效吗? openssl 文档声明 -startdate 和 -enddate 期望 YYMMDDHHMMSSZ 中的日期,这不允许 4 数字年份表示。
  • @Grasshopper 最好的方法是尝试一下:openssl ca -config conf/caconfig.cnf -startdate 20160107071311Z -enddate 20170106071311Z -batch -out server_cert_2048.pem -in server_cert_2048.pem.csr 产生 err Certificate is to be certified until Jan 6 07:13:11 2017 GMT (363 days):是的!
  • -startdate 选项不受支持
【解决方案2】:

只需将 openssl apps/req.c 的第 843 行中的硬编码零替换为以秒为单位的时移

https://github.com/openssl/openssl/blob/master/apps/req.c#L843

if (!X509_gmtime_adj(X509_get_notBefore(x509ss),0)) goto end; 

使用日期(现在 - 10 天)创建请求的示例:

if (!X509_gmtime_adj(X509_get_notBefore(x509ss),-10*24*3600)) goto end;

【讨论】:

  • 您好,感谢您的回复:)您知道是否有什么方法可以做到这一点而无需重新编译命令行工具?
  • 从 req.c 判断没有这样的选项。可能存在其他一些我不知道的方法。
  • 好的,无论如何谢谢... +1 的好建议。如果我真的很绝望,我会尝试编译该实用程序以备后用:)
  • 您能否使用libfaketime 获得相同的结果,这可以通过 Ubuntu 中的apt-get 获得。 LD_PRELOAD=/usr/local/lib/libfaketime.so.1 FAKETIME="-15d" your_command_goes_here
猜你喜欢
  • 2016-01-22
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 2012-04-10
  • 2020-08-16
  • 1970-01-01
  • 2010-10-16
  • 2012-07-20
相关资源
最近更新 更多