本节介绍如何使用openssl 命令设置 SSL 证书和密钥文件以供 MySQL 服务器和客户端使用。第一个示例显示了一个简化的过程,例如您可能在命令行中使用的过程。第二个显示包含更多细节的脚本。前两个示例旨在在 Unix 上使用,并且都使用作为OpenSSL一部分的 openssl命令。第三个示例描述了如何在 Windows 上设置 SSL 文件。
笔记
有比此处描述的过程更容易生成 SSL 所需文件的替代方法:让服务器自动生成它们或使用 mysql_ssl_rsa_setup程序。请参阅 第 6.3.3.1 节,“使用 MySQL 创建 SSL 和 RSA 证书和密钥”。
重要的
无论您使用何种方法生成证书和密钥文件,用于服务器和客户端证书/密钥的公用名值都必须与用于 CA 证书的公用名值不同。否则,证书和密钥文件不适用于使用 OpenSSL 编译的服务器。这种情况下的典型错误是:
ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)
复制
示例 1:在 Unix 上从命令行创建 SSL 文件
以下示例显示了一组用于创建 MySQL 服务器和客户端证书和密钥文件的命令。您必须响应openssl命令的多个提示。要生成测试文件,您可以对所有提示按 Enter。要生成用于生产的文件,您应该提供非空响应。
# Create clean environment rm -rf newcerts mkdir newcerts && cd newcerts # Create CA certificate openssl genrsa 2048 > ca-key.pem openssl req -new -x509 -nodes -days 3600 \ -key ca-key.pem -out ca.pem # Create server certificate, remove passphrase, and sign it # server-cert.pem = public key, server-key.pem = private key openssl req -newkey rsa:2048 -days 3600 \ -nodes -keyout server-key.pem -out server-req.pem openssl rsa -in server-key.pem -out server-key.pem openssl x509 -req -in server-req.pem -days 3600 \ -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem # Create client certificate, remove passphrase, and sign it # client-cert.pem = public key, client-key.pem = private key openssl req -newkey rsa:2048 -days 3600 \ -nodes -keyout client-key.pem -out client-req.pem openssl rsa -in client-key.pem -out client-key.pem openssl x509 -req -in client-req.pem -days 3600 \ -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
复制
生成证书后,验证它们:
openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
复制
您应该会看到如下响应:
server-cert.pem: OK client-cert.pem: OK
复制
要查看证书的内容(例如,检查证书有效的日期范围),请像这样调用 openssl:
openssl x509 -text -in ca.pem openssl x509 -text -in server-cert.pem openssl x509 -text -in client-cert.pem
复制
现在您有一组可以按如下方式使用的文件:
ca.pem
: 使用这个来设置ssl_ca
服务器端的 系统变量和--ssl-ca
客户端的 选项。(如果使用 CA 证书,则双方必须相同。)server-cert.pem
,server-key.pem
: 使用这些来设置服务器端的ssl_cert
和ssl_key
系统变量。client-cert.pem
,client-key.pem
: 将这些用作客户端的--ssl-cert
和--ssl-key
选项的参数 。
有关其他使用说明,请参阅 第 6.3.1 节,“配置 MySQL 以使用加密连接”。
示例 2:在 Unix 上使用脚本创建 SSL 文件
这是一个示例脚本,展示了如何为 MySQL 设置 SSL 证书和密钥文件。执行脚本后,如第 6.3.1 节“配置 MySQL 以使用加密连接”中所述,将文件用于 SSL 连接 。
DIR=`pwd`/openssl PRIV=$DIR/private mkdir $DIR $PRIV $DIR/newcerts cp /usr/share/ssl/openssl.cnf $DIR replace ./demoCA $DIR -- $DIR/openssl.cnf # Create necessary files: $database, $serial and $new_certs_dir # directory (optional) touch $DIR/index.txt echo "01" > $DIR/serial # # Generation of Certificate Authority(CA) # openssl req -new -x509 -keyout $PRIV/cakey.pem -out $DIR/ca.pem \ -days 3600 -config $DIR/openssl.cnf # Sample output: # Using configuration from /home/jones/openssl/openssl.cnf # Generating a 1024 bit RSA private key # ................++++++ # .........++++++ # writing new private key to '/home/jones/openssl/private/cakey.pem' # Enter PEM pass phrase: # Verifying password - Enter PEM pass phrase: # ----- # You are about to be asked to enter information to be # incorporated into your certificate request. # What you are about to enter is what is called a Distinguished Name # or a DN. # There are quite a few fields but you can leave some blank # For some fields there will be a default value, # If you enter '.', the field will be left blank. # ----- # Country Name (2 letter code) [AU]:FI # State or Province Name (full name) [Some-State]:. # Locality Name (eg, city) []: # Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB # Organizational Unit Name (eg, section) []: # Common Name (eg, YOUR name) []:MySQL admin # Email Address []: # # Create server request and key # openssl req -new -keyout $DIR/server-key.pem -out \ $DIR/server-req.pem -days 3600 -config $DIR/openssl.cnf # Sample output: # Using configuration from /home/jones/openssl/openssl.cnf # Generating a 1024 bit RSA private key # ..++++++ # ..........++++++ # writing new private key to '/home/jones/openssl/server-key.pem' # Enter PEM pass phrase: # Verifying password - Enter PEM pass phrase: # ----- # You are about to be asked to enter information that will be # incorporated into your certificate request. # What you are about to enter is what is called a Distinguished Name # or a DN. # There are quite a few fields but you can leave some blank # For some fields there will be a default value, # If you enter '.', the field will be left blank. # ----- # Country Name (2 letter code) [AU]:FI # State or Province Name (full name) [Some-State]:. # Locality Name (eg, city) []: # Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB # Organizational Unit Name (eg, section) []: # Common Name (eg, YOUR name) []:MySQL server # Email Address []: # # Please enter the following 'extra' attributes # to be sent with your certificate request # A challenge password []: # An optional company name []: # # Remove the passphrase from the key # openssl rsa -in $DIR/server-key.pem -out $DIR/server-key.pem # # Sign server cert # openssl ca -cert $DIR/ca.pem -policy policy_anything \ -out $DIR/server-cert.pem -config $DIR/openssl.cnf \ -infiles $DIR/server-req.pem # Sample output: # Using configuration from /home/jones/openssl/openssl.cnf # Enter PEM pass phrase: # Check that the request matches the signature # Signature ok # The Subjects Distinguished Name is as follows # countryName :PRINTABLE:'FI' # organizationName :PRINTABLE:'MySQL AB' # commonName :PRINTABLE:'MySQL admin' # Certificate is to be certified until Sep 13 14:22:46 2003 GMT # (365 days) # Sign the certificate? [y/n]:y # # # 1 out of 1 certificate requests certified, commit? [y/n]y # Write out database with 1 new entries # Data Base Updated # # Create client request and key # openssl req -new -keyout $DIR/client-key.pem -out \ $DIR/client-req.pem -days 3600 -config $DIR/openssl.cnf # Sample output: # Using configuration from /home/jones/openssl/openssl.cnf # Generating a 1024 bit RSA private key # .....................................++++++ # .............................................++++++ # writing new private key to '/home/jones/openssl/client-key.pem' # Enter PEM pass phrase: # Verifying password - Enter PEM pass phrase: # ----- # You are about to be asked to enter information that will be # incorporated into your certificate request. # What you are about to enter is what is called a Distinguished Name # or a DN. # There are quite a few fields but you can leave some blank # For some fields there will be a default value, # If you enter '.', the field will be left blank. # ----- # Country Name (2 letter code) [AU]:FI # State or Province Name (full name) [Some-State]:. # Locality Name (eg, city) []: # Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB # Organizational Unit Name (eg, section) []: # Common Name (eg, YOUR name) []:MySQL user # Email Address []: # # Please enter the following 'extra' attributes # to be sent with your certificate request # A challenge password []: # An optional company name []: # # Remove the passphrase from the key # openssl rsa -in $DIR/client-key.pem -out $DIR/client-key.pem # # Sign client cert # openssl ca -cert $DIR/ca.pem -policy policy_anything \ -out $DIR/client-cert.pem -config $DIR/openssl.cnf \ -infiles $DIR/client-req.pem # Sample output: # Using configuration from /home/jones/openssl/openssl.cnf # Enter PEM pass phrase: # Check that the request matches the signature # Signature ok # The Subjects Distinguished Name is as follows # countryName :PRINTABLE:'FI' # organizationName :PRINTABLE:'MySQL AB' # commonName :PRINTABLE:'MySQL user' # Certificate is to be certified until Sep 13 16:45:17 2003 GMT # (365 days) # Sign the certificate? [y/n]:y # # # 1 out of 1 certificate requests certified, commit? [y/n]y # Write out database with 1 new entries # Data Base Updated # # Create a my.cnf file that you can use to test the certificates # cat <<EOF > $DIR/my.cnf [client] ssl-ca=$DIR/ca.pem ssl-cert=$DIR/client-cert.pem ssl-key=$DIR/client-key.pem [mysqld] ssl_ca=$DIR/ca.pem ssl_cert=$DIR/server-cert.pem ssl_key=$DIR/server-key.pem EOF
复制
示例 3:在 Windows 上创建 SSL 文件
如果您的系统上未安装 OpenSSL for Windows,请下载它。可以在此处查看可用软件包的概述:
http://www.slproweb.com/products/Win32OpenSSL.html
复制
根据您的架构(32 位或 64 位),选择 Win32 OpenSSL Light 或 Win64 OpenSSL Light 包。默认安装位置为C:\OpenSSL-Win32
或C:\OpenSSL-Win64
,具体取决于您下载的软件包。以下说明假定默认位置为C:\OpenSSL-Win32
。如果您使用的是 64 位包,请根据需要修改它。
如果在安装过程中出现指示 的消息 '...critical component is missing: Microsoft Visual C++ 2008 Redistributables'
,请取消安装并下载以下软件包之一,同样取决于您的体系结构(32 位或 64 位):
-
Visual C++ 2008 Redistributables (x86),可从以下网址获得:
http://www.microsoft.com/downloads/details.aspx?familyid=9B2DA534-3E03-4391-8A4D-074B9F2BC1BF
复制 -
Visual C++ 2008 Redistributables (x64),可从以下网址获得:
http://www.microsoft.com/downloads/details.aspx?familyid=bd2a6171-e2d6-4230-b809-9a8d7548c1b6
复制
安装附加包后,重新启动 OpenSSL 设置过程。
在安装过程中,保留默认 C:\OpenSSL-Win32
作为安装路径,并保持'Copy OpenSSL DLL files to the Windows system directory'
选中默认选项。
安装完成后,添加 C:\OpenSSL-Win32\bin
到您服务器的 Windows 系统路径变量(根据您的 Windows 版本,以下路径设置说明可能略有不同):
-
在 Windows 桌面上,右键单击我的电脑图标,然后选择 属性。
-
从出现的系统属性菜单中 选择高级选项卡,然后单击环境变量按钮。
-
在System Variables 下,选择 Path,然后单击 Edit按钮。应出现“**编辑系统变量”**对话框。
-
添加
';C:\OpenSSL-Win32\bin'
到最后(注意分号)。 -
按确定 3 次。
-
通过打开新的命令控制台 ( Start>Run>cmd.exe ) 并验证 OpenSSL 是否可用,检查 OpenSSL 是否正确集成到 Path 变量中:
Microsoft Windows [Version ...] Copyright (c) 2006 Microsoft Corporation. All rights reserved. C:\Windows\system32>cd \ C:\>openssl OpenSSL> exit <<< If you see the OpenSSL prompt, installation was successful. C:\>
复制
安装 OpenSSL 后,使用与示例 1(本节前面所示)类似的说明,但进行以下更改:
-
更改以下 Unix 命令:
# Create clean environment rm -rf newcerts mkdir newcerts && cd newcerts
复制在 Windows 上,请改用以下命令:
# Create clean environment md c:\newcerts cd c:\newcerts
复制 -
当一个
'\'
字符显示在命令行的末尾时,'\'
必须删除该字符并将命令行全部输入到一行中。
生成证书和密钥文件后,要将它们用于 SSL 连接,请参阅 第 6.3.1 节,“配置 MySQL 以使用加密连接”。