117.info
人生若只如初见

如何用OpenSSL在Linux上实现双向认证

在Linux上使用OpenSSL实现双向认证(也称为客户端证书认证)涉及几个步骤,包括生成证书颁发机构(CA)、生成服务器证书和密钥、生成客户端证书和密钥,以及配置服务器和客户端以使用这些证书进行双向认证。以下是一个详细的步骤指南:

1. 生成CA证书和密钥

首先,你需要创建一个CA(证书颁发机构),用于签发服务器和客户端的证书。

# 创建CA目录 mkdir -p ca/newcerts echo 1000 > ca/serial # 创建CA配置文件 cat < ca/openssl.cnf [ ca ] default_ca = CA_default [ CA_default ] dir = /etc/ssl/ssl-ca certs = \$dir/certs crl_dir = \$dir/crl new_certs_dir = \$dir/newcerts database = \$dir/index.txt serial = \$dir/serial RANDFILE = \$dir/private/.rand [ req ] default_bits = 2048 distinguished_name = req_distinguished_name string_mask = utf8only [ req_distinguished_name ] countryName = Country Name (2 letter code) stateOrProvinceName = State or Province Name localityName = Locality Name organizationName = Organization Name commonName = Common Name [ v3_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true keyUsage = critical, digitalSignature, cRLSign, keyCertSign EOF # 创建CA私钥 openssl genpkey -algorithm RSA -out ca/private/ca-key.pem -aes256 # 创建CA证书 openssl req -config ca/openssl.cnf -key ca/private/ca-key.pem -new -x509 -days 3650 -sha256 -extensions v3_ca -out ca/cacert.pem # 创建CA目录权限 chmod 700 ca/private chmod 644 ca/*.pem 

2. 生成服务器证书和密钥

接下来,生成服务器的证书和密钥。

# 创建服务器目录 mkdir -p server/newcerts echo 1000 > server/serial # 创建服务器配置文件 cat < server/openssl.cnf [ ca ] default_ca = CA_default [ CA_default ] dir = /etc/ssl/ssl-ca certs = \$dir/certs crl_dir = \$dir/crl new_certs_dir = \$dir/newcerts database = \$dir/index.txt serial = \$dir/serial RANDFILE = \$dir/private/.rand [ req ] default_bits = 2048 distinguished_name = req_distinguished_name string_mask = utf8only [ req_distinguished_name ] countryName = Country Name (2 letter code) stateOrProvinceName = State or Province Name localityName = Locality Name organizationName = Organization Name commonName = Common Name [ v3_req ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:false keyUsage = critical, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth [ v3_server ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:false keyUsage = critical, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth EOF # 创建服务器私钥 openssl genpkey -algorithm RSA -out server/private/server-key.pem -aes256 # 创建服务器证书签名请求(CSR) openssl req -config server/openssl.cnf -key server/private/server-key.pem -new -out server/csr/server-csr.pem # 使用CA签发服务器证书 openssl x509 -req -in server/csr/server-csr.pem -CA ca/cacert.pem -CAkey ca/private/ca-key.pem -CAcreateserial -out server/cert/server-cert.pem -days 365 -sha256 

3. 生成客户端证书和密钥

同样地,生成客户端的证书和密钥。

# 创建客户端目录 mkdir -p client/newcerts echo 1000 > client/serial # 创建客户端配置文件 cat < client/openssl.cnf [ ca ] default_ca = CA_default [ CA_default ] dir = /etc/ssl/ssl-ca certs = \$dir/certs crl_dir = \$dir/crl new_certs_dir = \$dir/newcerts database = \$dir/index.txt serial = \$dir/serial RANDFILE = \$dir/private/.rand [ req ] default_bits = 2048 distinguished_name = req_distinguished_name string_mask = utf8only [ req_distinguished_name ] countryName = Country Name (2 letter code) stateOrProvinceName = State or Province Name localityName = Locality Name organizationName = Organization Name commonName = Common Name [ v3_req ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:false keyUsage = critical, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth [ v3_client ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:false keyUsage = critical, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth EOF # 创建客户端私钥 openssl genpkey -algorithm RSA -out client/private/client-key.pem -aes256 # 创建客户端证书签名请求(CSR) openssl req -config client/openssl.cnf -key client/private/client-key.pem -new -out client/csr/client-csr.pem # 使用CA签发客户端证书 openssl x509 -req -in client/csr/client-csr.pem -CA ca/cacert.pem -CAkey ca/private/ca-key.pem -CAcreateserial -out client/cert/client-cert.pem -days 365 -sha256 

4. 配置服务器以使用客户端证书

编辑服务器配置文件(例如/etc/ssl/ssl-ca/server/openssl.cnf),添加以下内容以启用客户端证书验证:

[ server ] ... SSLVerifyClient require SSLCACertificateFile /etc/ssl/ssl-ca/cacert.pem 

然后重启服务器以应用更改。

5. 配置客户端以使用服务器证书

编辑客户端配置文件(例如/etc/ssl/ssl-ca/client/openssl.cnf),添加以下内容以信任服务器证书:

[ ca ] ... trusted_first = no 

然后重启客户端以应用更改。

6. 测试双向认证

使用openssl s_client命令测试双向认证:

# 在服务器上运行 openssl s_client -connect localhost:443 -cert client/cert/client-cert.pem -key client/private/client-key.pem -CAfile ca/cacert.pem # 在客户端上运行 openssl s_client -connect localhost:443 -cert server/cert/server-cert.pem -key server/private/server-key.pem -CAfile ca/cacert.pem 

通过这些步骤,你应该能够在Linux上使用OpenSSL实现双向认证。

未经允许不得转载 » 本文链接:https://www.117.info/ask/fe743AzsNBAZWAVU.html

推荐文章

  • 如何利用Rust进行Linux网络编程

    在Rust中进行Linux网络编程,你可以使用标准库中的std::net模块,它提供了一些基本的类型和trait来处理网络连接。此外,还有一些第三方库可以帮助你更方便地进行...

  • Linux系统中如何查看回收站

    在Linux系统中,查看回收站的方法取决于所使用的桌面环境和文件管理器。以下是一些常见桌面环境和文件管理器的查看回收站的方法:
    GNOME(GNOME Shell) 使...

  • 怎样用lsnrctl进行故障排查

    lsnrctl 是 Oracle 数据库的一个命令行工具,用于管理和监控监听器(Listener)。监听器负责接收客户端的连接请求并将其路由到适当的数据库实例。当遇到与监听器...

  • Linux里怎样查看回收站内容

    在Linux系统中,没有像Windows那样的图形界面回收站。但是,你可以使用命令行来查找和恢复已删除的文件。这里有一个名为extundelete的工具,它可以帮助你查看和恢...

  • ubuntu gimp网络共享

    在Ubuntu上使用GIMP进行网络共享并不是一个直接的功能,因为GIMP主要是一个图像编辑软件,而不是一个网络共享服务。不过,你可以通过以下几种方法来实现与GIMP相...

  • debian进程如何监控与日志分析

    在Debian系统上监控进程和进行日志分析可以通过多种命令和工具来实现。以下是一些常用的方法和工具:
    进程监控命令 top命令:实时显示系统中运行的进程信息...

  • Ubuntu Informix数据恢复方法

    在Ubuntu系统上恢复Informix数据库的数据,通常需要遵循以下步骤:
    准备工作 备份:在进行任何恢复操作之前,确保你有最近的数据库备份。Informix提供了多种...

  • Debian Extract与其他提取工具的比较

    在比较“Debian Extract”与其他提取工具时,首先需要澄清一点:“Debian Extract”并不是一个广为人知的特定提取工具的名称,而Debian系统本身是一个流行的Linu...