设置CA证书来强化PostgreSQL的安全性的教程
在经历了多次的摸索实验后我终于成功地实现了SSL证书认证的功能,因此我想这次我要把这些步骤记录下来供日后查阅。
出于安全和方便的原因,我要在一台单独的专用机器上签署客户的证书,这台机器也称为证书授证中心(CA)。
这让我们在授权新的客户端时不必先登录到PostgreSQL服务器然后再签署证书或者修改pg_hba.conf。
我们要创建一个特殊的数据库组,叫sslcertusers。这个组里的所有用户都可以通过由CA签署的证书进行连接。
在下面的例子中,请将"trustly"替换成你的公司名或组织名。所有的命令都是基于UbuntuLinux12.04LTS。
设置CA
CA应该是一台离线的处于高度安全环境中的计算机。
生成CA私钥
sudoopensslgenrsa-des3-out/etc/ssl/private/trustly-ca.key2048 sudochownroot:ssl-cert/etc/ssl/private/trustly-ca.key sudochmod640/etc/ssl/private/trustly-ca.key
生成CA证书
sudoopensslreq-new-x509-days3650\ -subj'/C=SE/ST=Stockholm/L=Stockholm/O=Trustly/CN=trustly'\ -key/etc/ssl/private/trustly-ca.key\ -out/usr/local/share/ca-certificates/trustly-ca.crt sudoupdate-ca-certificates
配置PostgreSQL服务器
生成PostgreSQL服务器私钥
#Removedefaultsnakeoilcerts sudorm/var/lib/postgresql/9.1/main/server.key sudorm/var/lib/postgresql/9.1/main/server.crt #Enterapassphrase sudo-upostgresopensslgenrsa-des3-out/var/lib/postgresql/9.1/main/server.key2048 #Removethepassphrase sudo-upostgresopensslrsa-in/var/lib/postgresql/9.1/main/server.key-out/var/lib/postgresql/9.1/main/server.key sudo-upostgreschmod400/var/lib/postgresql/9.1/main/server.key
生成PostgreSQL服务器证书签署请求(CSR)
sudo-upostgresopensslreq-new-nodes-key/var/lib/postgresql/9.1/main/server.key-days3650-out/tmp/server.csr-subj'/C=SE/ST=Stockholm/L=Stockholm/O=Trustly/CN=postgres'
用CA私钥签署PostgreSQL服务器证书请求
sudoopensslreq-x509\ -key/etc/ssl/private/trustly-ca.key\ -in/tmp/server.csr\ -out/var/lib/postgresql/9.1/main/server.crt sudochownpostgres:postgres/var/lib/postgresql/9.1/main/server.crt
创建根(root)证书=PostgreSQL服务器证书+CA证书
sudo-upostgressh-c'cat/var/lib/postgresql/9.1/main/server.crt/etc/ssl/certs/trustly-ca.pem>/var/lib/postgresql/9.1/main/root.crt' sudocp/var/lib/postgresql/9.1/main/root.crt/usr/local/share/ca-certificates/trustly-postgresql.crt sudoupdate-ca-certificates
授权访问
CREATEGROUPsslcertusers; ALTERGROUPsslcertusersADDUSERjoel; #/etc/postgresql/9.1/main/pg_hba.conf: hostsslnameofdatabase+sslcertusers192.168.1.0/24certclientcert=1
重启PostgreSQL
sudoservicepostgresqlrestart
PostgreSQL客户端设置
从PostgreSQL服务器上复制根证书
mkdir~/.postgresql cp/etc/ssl/certs/trustly-postgresql.pem~/.postgresql/root.crt
生成PostgreSQL客户端私钥
opensslgenrsa-des3-out~/.postgresql/postgresql.key1024 #Ifthisisaserver,removethepassphrase: opensslrsa-in~/.postgresql/postgresql.key-out~/.postgresql/postgresql.key
生成PostgreSQL客户端证书签署请求并签署
#Replace"joel"withusername: opensslreq-new-key~/.postgresql/postgresql.key-out~/.postgresql/postgresql.csr-subj'/C=SE/ST=Stockholm/L=Stockholm/O=Trustly/CN=joel' sudoopensslx509-req-in~/.postgresql/postgresql.csr-CA/etc/ssl/certs/trustly-ca.pem-CAkey/etc/ssl/private/trustly-ca.key-out~/.postgresql/postgresql.crt-CAcreateserial sudochownjoel:joel-R~/.postgresql sudochmod400-R~/.postgresql/postgresql.key