web-dev-qa-db-ja.com

OpenSSLで自己署名証明書を作成する方法

HTTPSのサポートを組み込みLinuxデバイスに追加しています。これらの手順で自己署名証明書を生成しようとしました。

openssl req -new > cert.csr
openssl rsa -in privkey.pem -out key.pem
openssl x509 -in cert.csr -out cert.pem -req -signkey key.pem -days 1001
cat key.pem>>cert.pem

これはうまくいきますが、例えばGoogle Chromeではいくつかエラーが出ます。

これはおそらくあなたが探しているサイトではありません!
サイトのセキュリティ証明書は信頼されていません。

私は何かが足りないのですか?これは自己署名証明書を作成するための正しい方法ですか?

1052
michelemarcon

これは1つのコマンドで実行できます。

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365

秘密鍵をパスフレーズで保護したくない場合は、-nodesno DESの略)を追加することもできます。それ以外の場合は、「少なくとも4文字」のパスワードの入力を求められます。

有効期限に影響を与えるために任意の数に置き換えることができるdaysパラメータ(365)。それはそれから「国名」のような事のためにあなたを促すでしょう、しかしあなたはただ打つことができます Enter そしてデフォルトを受け入れます。

証明書の内容に関する質問を抑制するために-subj '/CN=localhost'を追加します(localhostを希望のドメインに置き換えます)。

以前にブラウザに証明書をインポートしない限り、自己署名証明書は第三者に対して検証されません。さらにセキュリティが必要な場合は、 認証局 (CA)で署名された証明書を使用してください。

1793
Diego Woitasen

何か不足していますか?これは自己署名証明書を作成する正しい方法ですか?

自己署名証明書を作成するのは簡単です。 openssl reqコマンドを使用するだけです。ブラウザーやコマンドラインツールなど、最も多くのクライアントが使用できるものを作成するのは難しい場合があります。

ブラウザには独自の要件があり、 IETF よりも制限が厳しいため、困難です。ブラウザーで使用される要件は、 CA/Browser Forums で文書化されています(以下の参照を参照)。制限は、2つの重要な領域で発生します。(1)トラストアンカー、および(2)DNS名。

最新のブラウザ(2014/2015で使用しているウェアーズなど)は、トラストアンカーにチェーンバックする証明書が必要であり、証明書で特定の方法でDNS名を提示する必要があります。また、ブラウザは、自己署名サーバー証明書に対して積極的に移行しています。

一部のブラウザは、自己署名サーバー証明書のインポートを正確に簡単に行えません。実際、Androidのブラウザなど、一部のブラウザでは使用できません。したがって、完全なソリューションは、あなた自身の権限になることです。

独自の権限になることができない場合、DNS名を正しく取得して、証明書に最大の成功のチャンスを与える必要があります。しかし、私はあなた自身の権威になることをお勧めします。自分の権限になりやすく、すべての信頼の問題を回避します(自分よりも信頼する方が良いでしょうか?)。


これはおそらくあなたが探しているサイトではありません!
サイトのセキュリティ証明書は信頼されていません!

これは、ブラウザが事前定義されたトラストアンカーのリストを使用してサーバー証明書を検証するためです。自己署名証明書は、信頼できるアンカーにチェーンバックしません。

これを回避する最善の方法は次のとおりです。

  1. 独自の権限を作成します(つまり、 CA になります)
  2. サーバーの証明書署名要求(CSR)を作成する
  3. CAキーを使用してサーバーのCSRに署名する
  4. サーバー証明書をサーバーにインストールします
  5. クライアントにCA証明書をインストールします

ステップ1-独自の認証局を作成するは、CA: trueおよび適切なキー使用法を使用して自己署名証明書を作成することを意味します。つまり、SubjectおよびIssuerCAはBasic Constraints(クリティカルとしてマークする必要があります)でtrueに設定され、キーの使用法はkeyCertSignおよびcrlSignCRLを使用している場合)であり、_(Subject Key Identifier(SKI)はAuthority Key Identifier(AKI)と同じです。

独自の認証局になるには、* を参照してください。認証局で証明書署名要求に署名するにはどうすればよいですか? スタックオーバーフロー。次に、ブラウザで使用されるトラストストアにCAをインポートします。

手順2〜4は、 Startcom または CAcert などのCAのサービスを登録するときに、公開サーバーに対して現在実行しているおおよその手順です。ステップ1と5を使用すると、サードパーティの権限を回避し、独自の権限として動作できます(自分よりも信頼する方が良いでしょうか?)。

ブラウザの警告を回避するための次善の方法は、サーバーの証明書を信頼することです。ただし、Androidのデフォルトのブラウザーなど、一部のブラウザーでは実行できません。そのため、プラットフォーム上では機能しません。

ブラウザ(および他の同様のユーザーエージェント)の問題not自己署名証明書を信頼することは、モノのインターネット(IoT)で大きな問題になります。たとえば、それをプログラムするためのサーモスタットまたは冷蔵庫?答えは、ユーザーエクスペリエンスに関する限り、何も良いことではありません。

W3CのWebAppSecワーキンググループはこの問題を検討し始めています。たとえば、 Proposal:Marking HTTP as Non-Secure を参照してください。


OpenSSLで自己署名証明書を作成する方法

以下のコマンドと構成ファイルは、自己署名証明書を作成します(署名要求の作成方法も示します)。自己署名証明書に使用されるDNS名は、共通名(CN)ではなく、サブジェクト代替名(SAN)にあります。

DNS名は、構成ファイルのSANにsubjectAltName = @alternate_names行で配置されます(コマンドラインから実行する方法はありません)。次に、構成ファイルにalternate_namesセクションがあります(好みに合わせて調整する必要があります)。

[ alternate_names ]

DNS.1       = example.com
DNS.2       = www.example.com
DNS.3       = mail.example.com
DNS.4       = ftp.example.com

# Add these if you need them. But usually you don't want them or
#   need them in production. You may need them for development.
# DNS.5       = localhost
# DNS.6       = localhost.localdomain
# DNS.7       = 127.0.0.1

# IPv6 localhost
# DNS.8     = ::1

IETFとCA/Browserフォーラムの両方がプラクティスを指定しているため、CNではなくSANにDNS名を配置することが重要です。また、CNのDNS名が非推奨であることも指定します(ただし、 CNにDNS名を入力する場合、はCA/Bポリシーの下のSANに含まれる必要があります。したがって、サブジェクト代替の使用を避けることはできません。名。

SANにDNS名を配置しない場合、CA/Browser Forumのガイドラインに従っているブラウザーおよびその他のユーザーエージェントで証明書を検証できません。

関連:ブラウザはCA/Browser Forumポリシーに従います。 IETFポリシーではありません。これは、OpenSSLで作成された証明書(一般にIETFに準拠)がブラウザーで検証されない場合がある理由の1つです(ブラウザーはCA/Bに準拠します)。それらは異なる標準であり、異なる発行ポリシーと異なる検証要件を持っています。


自己署名証明書の作成-x509オプションの追加に注意してください):

openssl req -config example-com.conf -new -x509 -sha256 -newkey rsa:2048 -nodes \
    -keyout example-com.key.pem -days 365 -out example-com.cert.pem

署名リクエストを作成します-x509オプションがないことに注意してください):

openssl req -config example-com.conf -new -sha256 -newkey rsa:2048 -nodes \
    -keyout example-com.key.pem -days 365 -out example-com.req.pem

自己署名証明書の印刷

openssl x509 -in example-com.cert.pem -text -noout

署名リクエストの印刷

openssl req -in example-com.req.pem -text -noout

構成ファイル(-configオプションを介して渡される)

[ req ]
default_bits        = 2048
default_keyfile     = server-key.pem
distinguished_name  = subject
req_extensions      = req_ext
x509_extensions     = x509_ext
string_mask         = utf8only

# The Subject DN can be formed using X501 or RFC 4514 (see RFC 4519 for a description).
#   Its sort of a mashup. For example, RFC 4514 does not provide emailAddress.
[ subject ]
countryName         = Country Name (2 letter code)
countryName_default     = US

stateOrProvinceName     = State or Province Name (full name)
stateOrProvinceName_default = NY

localityName            = Locality Name (eg, city)
localityName_default        = New York

organizationName         = Organization Name (eg, company)
organizationName_default    = Example, LLC

# Use a friendly name here because it's presented to the user. The server's DNS
#   names are placed in Subject Alternate Names. Plus, DNS names here is deprecated
#   by both IETF and CA/Browser Forums. If you place a DNS name here, then you
#   must include the DNS name in the SAN too (otherwise, Chrome and others that
#   strictly follow the CA/Browser Baseline Requirements will fail).
commonName          = Common Name (e.g. server FQDN or YOUR name)
commonName_default      = Example Company

emailAddress            = Email Address
emailAddress_default        = [email protected]

# Section x509_ext is used when generating a self-signed certificate. I.e., openssl req -x509 ...
[ x509_ext ]

subjectKeyIdentifier        = hash
authorityKeyIdentifier    = keyid,issuer

# You only need digitalSignature below. *If* you don't allow
#   RSA Key transport (i.e., you use ephemeral cipher suites), then
#   omit keyEncipherment because that's key transport.
basicConstraints        = CA:FALSE
keyUsage            = digitalSignature, keyEncipherment
subjectAltName          = @alternate_names
nsComment           = "OpenSSL Generated Certificate"

# RFC 5280, Section 4.2.1.12 makes EKU optional
#   CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
#   In either case, you probably only need serverAuth.
# extendedKeyUsage    = serverAuth, clientAuth

# Section req_ext is used when generating a certificate signing request. I.e., openssl req ...
[ req_ext ]

subjectKeyIdentifier        = hash

basicConstraints        = CA:FALSE
keyUsage            = digitalSignature, keyEncipherment
subjectAltName          = @alternate_names
nsComment           = "OpenSSL Generated Certificate"

# RFC 5280, Section 4.2.1.12 makes EKU optional
#   CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
#   In either case, you probably only need serverAuth.
# extendedKeyUsage    = serverAuth, clientAuth

[ alternate_names ]

DNS.1       = example.com
DNS.2       = www.example.com
DNS.3       = mail.example.com
DNS.4       = ftp.example.com

# Add these if you need them. But usually you don't want them or
#   need them in production. You may need them for development.
# DNS.5       = localhost
# DNS.6       = localhost.localdomain
# DNS.7       = 127.0.0.1

# IPv6 localhost
# DNS.8     = ::1

Chromeで次の操作が必要になる場合があります。そうでなければ ChromeはCommon Nameis invalid(ERR_CERT_COMMON_NAME_INVALID 。SANのIPアドレスと[このインスタンスのCN。

# IPv4 localhost
# IP.1       = 127.0.0.1

# IPv6 localhost
# IP.2     = ::1

X.509/PKIX証明書のDNS名の処理に関する他のルールがあります。ルールについては、次のドキュメントを参照してください。

RFC 6797およびRFC 7469は、他のRFCおよびCA/Bドキュメントよりも制限が厳しいため、リストされています。 RFC 6797および7469 はIPアドレスも許可しません。

470
jww

これは @ diegows's answer で説明されているオプションです。 ドキュメントから

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days XXX
req

PKCS#10証明書要求と証明書生成ユーティリティ。

-x509

このオプションは、証明書要求の代わりに自己署名証明書を出力します。これは通常、テスト証明書または自己署名ルートCAを生成するために使用されます。

-newkey arg

このオプションは、新しい証明書要求と新しい秘密鍵を作成します。引数はいくつかの形式のうちの1つを取ります。 rsa:nbits 、ここで nbits はビット数で、サイズがRSA鍵 nbits を生成します。

-keyout filename

これは新しく作成された秘密鍵を書き込むためのファイル名を与えます。

-out filename

これは、書き込むファイル名、またはデフォルトで標準出力を指定します。

-days n

-x509 オプションが使用されている場合、これは証明書を認証する日数を指定します。デフォルトは30日です。

-nodes

このオプションを指定した場合、秘密鍵が作成されても暗号化されません。

ドキュメントは実際には上記より詳細です。ここで要約しました。

385
user456814

2019年の時点で、次のコマンドはSANを含むすべてのニーズを満たします。

openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout example.key -out example.crt -extensions san -config <(echo "[req]"; echo distinguished_name=req; echo "[san]"; echo subjectAltName=DNS:example.com,DNS:example.net,IP:10.0.0.1) -subj /CN=example.com

OpenSSL≧1.1.1では、これは以下のように短縮できます。

openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout example.key -out example.crt -subj /CN=example.com -addext subjectAltName=DNS:example.com,DNS:example.net,IP:10.0.0.1

証明書を作成します。

  • ドメインexample.comおよびexample.net(SAN)に有効
  • iPアドレス10.0.0.1(SAN)にも有効です。
  • 比較的強い(2019年現在)
  • 3650日(〜10年)有効です。

次のファイルを作成します。

  • 秘密鍵:example.key
  • 証明書:example.crt

すべての情報はコマンドラインで提供されています。面倒なインタラクティブ入力はありません。設定ファイルをいじる必要はありません。秘密鍵の生成から自己署名証明書まで、必要なすべてのステップがこの単一のOpenSSL呼び出しによって実行されます。

備考#1:暗号パラメータ

証明書は自己署名されており、ユーザーが手動で承認する必要があるため、短い有効期限または弱い暗号化を使用しても意味がありません。

将来的には、RSAキーと4096よりも強いハッシュアルゴリズムにsha256ビット以上を使用したいと思うかもしれませんが、2019年時点でこれらは正しい値です。最近のすべてのブラウザでサポートされていると同時に十分に強力です。

備考2:パラメータ "-nodes"

理論的には-nodesパラメータを省略することができます(これは "no DES encryption"を意味します)、その場合example.keyはパスワードで暗号化されます。ただし、これはサーバーのインストールにはほとんど役に立ちません。サーバーにもパスワードを保存する必要があるか、再起動のたびに手動でパスワードを入力する必要があるためです。

備考#3:MinGW

MinGW bashのWindowsでは、コマンドの前にMSYS_NO_PATHCONV=1を付ける必要があります。

MSYS_NO_PATHCONV=1 openssl ...

または、プレーンなcmd.exe Windowsコマンドプロンプトでコマンドを実行します。

備考#4: も参照のこと。

203
vog

私はコメントできないので、これを別の回答として置きます。私は、受け入れられているワンライナー回答でいくつかの問題を見つけました:

  • ワンライナーの鍵にはパスフレーズが含まれています。
  • ワンライナーは多くのブラウザでコンソールで警告を投げるSHA-1を使用します。

これは、パスフレーズを削除し、警告を抑制するためのセキュリティを強化し、-subjに渡して完全な質問リストを削除するという提案をコメントに含めるものです。

openssl genrsa -out server.key 2048
openssl rsa -in server.key -out server.key
openssl req -sha256 -new -key server.key -out server.csr -subj '/CN=localhost'
openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt

'localhost'を、必要なドメインに置き換えます。 OpenSSLがパスフレーズを要求するので、最初の2つのコマンドを1つずつ実行する必要があります。

2つを.pemファイルにまとめるには:

cat server.crt server.key > cert.pem
127
Mike N

最近のブラウザでは、SAN(Subject Alternate Name)が欠落していると、それ以外の場合は整形式の自己署名証明書に対してセキュリティエラーが発生するようになりました。OpenSSLはこれを指定するためのコマンドライン方法を提供していません、多くの開発者向けチュートリアルやブックマークは突然時代遅れになっています。

再度実行する最も簡単な方法は、短いスタンドアロンのconfファイルです。

  1. OpenSSL設定ファイルを作成します(例:req.cnf

    [req]
    distinguished_name = req_distinguished_name
    x509_extensions = v3_req
    Prompt = no
    [req_distinguished_name]
    C = US
    ST = VA
    L = SomeCity
    O = MyCompany
    OU = MyDivision
    CN = www.company.com
    [v3_req]
    keyUsage = critical, digitalSignature, keyAgreement
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_names
    [alt_names]
    DNS.1 = www.company.com
    DNS.2 = company.com
    DNS.3 = company.net
    
  2. この設定ファイルを参照する証明書を作成します

    openssl req -x509 -nodes -days 730 -newkey rsa:2048 \
     -keyout cert.key -out cert.pem -config req.cnf -sha256
    

https://support.citrix.com/article/CTX135602 からの設定例

71
rymo

SHA-2ハッシュアルゴリズムを使用するには、 -sha256 パラメータを追加することをお勧めします。これは、主要なブラウザが「SHA-1証明書」を安全でないと表示することを検討しているためです。

承認された回答と同じコマンドライン - 追加された-sha256を持つ@diegows

openssl req -x509 -sha256 -newkey rsa:2048 -keyout key.pem -out cert.pem -days XXX

Googleセキュリティブログ に詳細情報があります。

2018年5月に更新。 多くのコメントにあるように、SHA-2を使用しても自己署名証明書にセキュリティは追加されません。しかし、古くて安全でない暗号ハッシュ関数を使用しないことをお勧めします。完全な説明はエンドエンティティ証明書より上の証明書がSHA-1ベースであることに問題がないのはなぜですか?で利用可能です。

66
Maris B.

これは、自己署名証明書のSAN(subjectAltName)を設定するためにローカルボックスで使用するスクリプトです。

このスクリプトはドメイン名(example.com)を取得し、同じ証明書内の* .example.comとexample.comに対してSANを生成します。以下のセクションがコメントされています。スクリプトに名前を付け(例:generate-ssl.sh)、実行可能な権限を与えます。ファイルはスクリプトと同じディレクトリに書き込まれます。

Chrome 58以降では、自己署名証明書にSANを設定する必要があります。

#!/usr/bin/env bash

# Set the TLD domain we want to use
BASE_DOMAIN="example.com"

# Days for the cert to live
DAYS=1095

# A blank passphrase
PASSPHRASE=""

# Generated configuration file
CONFIG_FILE="config.txt"

cat > $CONFIG_FILE <<-EOF
[req]
default_bits = 2048
Prompt = no
default_md = sha256
x509_extensions = v3_req
distinguished_name = dn

[dn]
C = CA
ST = BC
L = Vancouver
O = Example Corp
OU = Testing Domain
emailAddress = webmaster@$BASE_DOMAIN
CN = $BASE_DOMAIN

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = *.$BASE_DOMAIN
DNS.2 = $BASE_DOMAIN
EOF

# The file name can be anything
FILE_NAME="$BASE_DOMAIN"

# Remove previous keys
echo "Removing existing certs like $FILE_NAME.*"
chmod 770 $FILE_NAME.*
rm $FILE_NAME.*

echo "Generating certs for $BASE_DOMAIN"

# Generate our Private Key, CSR and Certificate
# Use SHA-2 as SHA-1 is unsupported from Jan 1, 2017

openssl req -new -x509 -newkey rsa:2048 -sha256 -nodes -keyout "$FILE_NAME.key" -days $DAYS -out "$FILE_NAME.crt" -passin pass:$PASSPHRASE -config "$CONFIG_FILE"

# OPTIONAL - write an info to see the details of the generated crt
openssl x509 -noout -fingerprint -text < "$FILE_NAME.crt" > "$FILE_NAME.info"

# Protect the key
chmod 400 "$FILE_NAME.key"

このスクリプトは情報ファイルも書き込むので、新しい証明書を調べてSANが正しく設定されていることを確認できます。

                ...
                28:dd:b8:1e:34:b5:b1:44:1a:60:6d:e3:3c:5a:c4:
                da:3d
            Exponent: 65537 (0x10001)
    X509v3 extensions:
        X509v3 Subject Alternative Name: 
            DNS:*.example.com, DNS:example.com
Signature Algorithm: sha256WithRSAEncryption
     3b:35:5a:d6:9e:92:4f:fc:f4:f4:87:78:cd:c7:8d:cd:8c:cc:
     ...

Apacheを使用している場合は、設定ファイルで上記の証明書を次のように参照できます。

<VirtualHost _default_:443>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/htdocs

    SSLEngine on
    SSLCertificateFile path/to/your/example.com.crt
    SSLCertificateKeyFile path/to/your/example.com.key
</VirtualHost>

新しい証明書を有効にするために、必ずApache(またはNginx、またはIIS)サーバーを再起動してください。

16
Drakes

2017ワンライナー:

openssl req \
-newkey rsa:2048 \
-x509 \
-nodes \
-keyout server.pem \
-new \
-out server.pem \
-subj /CN=localhost \
-reqexts SAN \
-extensions SAN \
-config <(cat /System/Library/OpenSSL/openssl.cnf \
    <(printf '[SAN]\nsubjectAltName=DNS:localhost')) \
-sha256 \
-days 3650

他の設定ファイルがなくてもSANを提供するので、これはChrome 57でも機能します。回答から取られました こちら .

これにより、秘密鍵と証明書の両方を含む単一の.pemファイルが作成されます。必要に応じてそれらを別々の.pemファイルに移動できます。

9
joemillervi

ワンライナーFTW。私はそれを簡単にしておくのが好きです。必要なすべての引数を含む1つのコマンドを使用しないのはなぜですか?これが私の好みです。これはx509証明書とそのPEMキーを作成します。

openssl req -x509 \
 -nodes -days 365 -newkey rsa:4096 \
 -keyout self.key.pem \
 -out self-x509.crt \
 -subj "/C=US/ST=WA/L=Seattle/CN=example.com/[email protected]"

その単一のコマンドには、証明書の詳細について通常提供するすべての回答が含まれています。このようにして、パラメータを設定してコマンドを実行し、出力を得ることができます。それからコーヒーを飲みに行きます。

>>もっとここ<<

6
OkezieE

一般的な手順は正しいです。コマンドの構文は以下のとおりです。

openssl req -new -key {private key file} -out {output file}

ただし、ブラウザは既知の認証局(CA)で証明書を検証して識別情報を確認できなかったため、警告は表示されます。

これは自己署名証明書であるため、CAはなく、警告を無視して先に進むことができます。公衆インターネット上の誰でも認識できる本物の証明書を入手したい場合は、以下の手順に従います。

  1. 秘密鍵を生成する
  2. その秘密鍵を使用してCSRファイルを作成します。
  3. CAにCSRを提出する(Verisignなど)
  4. CAから受け取った証明書をWebサーバーにインストールする
  5. タイプcertに応じて認証チェーンに他のcertを追加する

これについての詳細はの記事の中にあります。接続の保護:OpenSSLを使ったセキュリティ証明書の作成

6
nneko

鍵を生成する

/etc/mysqlには/etc/apparmor.d/usr.sbin.mysqldが含まれているので、証明書ストレージに/etc/mysql/*.pem rを使用しています。

Sudo su -
cd /etc/mysql
openssl genrsa -out ca-key.pem 2048;
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem -out ca-cert.pem;
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem -out server-req.pem;
openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem;
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem -out client-req.pem;
openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem;

設定を追加

/etc/mysql/my.cnf

[client]
ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/client-cert.pem
ssl-key=/etc/mysql/client-key.pem

[mysqld]
ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem

私のセットアップでは、Ubuntuサーバーは次の場所にログインしました:/var/log/mysql/error.log

フォローアップノート:

  • SSL error: Unable to get certificate from '...'

    MySQLがあなたの証明書ファイルがapparmors設定にない場合、あなたの証明書ファイルへの読み取りアクセスを拒否されるかもしれません 。前の手順で説明したように、すべての証明書を.pemファイルとしてデフォルトでapparmorによって承認されている/etc/mysql/ディレクトリに保存します(または保存した場所にアクセスできるようにapparmor/SELinuxを変更します)

  • SSL error: Unable to get private key

    MySQLサーバのバージョンがデフォルトのrsa:2048フォーマットをサポートしていない可能性があります

    生成されたrsa:2048をプレーンなrsaに変換する:

    openssl rsa -in server-key.pem -out server-key.pem
    openssl rsa -in client-key.pem -out client-key.pem
    
  • ローカルサーバーがSSLをサポートしているか確認します

    mysql -u root -p
    mysql> show variables like "%ssl%";
    +---------------+----------------------------+
    | Variable_name | Value                      |
    +---------------+----------------------------+
    | have_openssl  | YES                        |
    | have_ssl      | YES                        |
    | ssl_ca        | /etc/mysql/ca-cert.pem     |
    | ssl_capath    |                            |
    | ssl_cert      | /etc/mysql/server-cert.pem |
    | ssl_cipher    |                            |
    | ssl_key       | /etc/mysql/server-key.pem  |
    +---------------+----------------------------+
    
  • データベースへの接続がSSL暗号化されていることの確認

    接続を確認中

    MySQLインスタンスにログインしたら、クエリを発行できます。

    show status like 'Ssl_cipher';
    

    接続が暗号化されていない場合、結果は空白になります。

    mysql> show status like 'Ssl_cipher';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | Ssl_cipher    |       |
    +---------------+-------+
    1 row in set (0.00 sec)
    

    そうでなければ、使用中の暗号の長さがゼロでない文字列が表示されます。

    mysql> show status like 'Ssl_cipher';
    +---------------+--------------------+
    | Variable_name | Value              |
    +---------------+--------------------+
    | Ssl_cipher    | DHE-RSA-AES256-SHA |
    +---------------+--------------------+
    1 row in set (0.00 sec)
    
  • 特定のユーザーの接続にSSLを要求します ( 'require ssl'):

    • SSL

    アカウントに対してSSL暗号化接続のみを許可するようにサーバーに指示します。

    GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
      REQUIRE SSL;
    

    接続するには、クライアントはサーバー証明書を認証するために--ssl-caオプションを指定する必要があります。さらに--ssl-keyおよび--ssl-certオプションを指定することもできます。 --ssl-caオプションも--ssl-capathオプションも指定されていない場合、クライアントはサーバー証明書を認証しません。


別のリンク:にある長いチュートリアル安全なPHP SSLを使用したMySQLへの接続

3
ThorSummoner

詳細に説明したように、 自己署名証明書インターネットに対して信頼されていませんすべてではないが多くのブラウザに自己署名証明書を追加 。または、 独自の認証局になります

認証局から署名付き証明書を取得したくない主な理由は、コストです- Symantecは証明書に対して年間995ドルから1,999ドルの間で請求します-内部ネットワークを対象とする証明書に対してのみ、シマンテックは年間399ドルを請求します 。クレジットカードでの支払いを処理している場合や、収益性の高い企業の利益センターで働いている場合、そのコストを正当化するのは簡単です。インターネットで作成している個人プロジェクト、または最小限の予算で実行している非営利団体、または組織のコストセンターで働いている場合、コストセンターは常により多くのことをしようとします少ないで。

別の方法は、 certbot を使用することです( about certbot を参照)。 Certbotは、WebサーバーのSSL/TLS証明書を取得して展開する使いやすい自動クライアントです。

Certbotをセットアップすると、 Let’s Encrypt 認証局によって発行された証明書を作成および維持できるようになります。

私は私の組織のために週末にこれをしました。サーバー(Ubuntu 16.04)にcertbotに必要なパッケージをインストールし、certbotのセットアップと有効化に必要なコマンドを実行しました。 certbotには DNSプラグイン が必要になる可能性があります。現在 DigitalOcean を使用していますが、すぐに別のサービスに移行する可能性があります。

一部の指示は正しくないため、Googleで把握するのに少し突っ込み、時間がかかりました。これには初めてかなりの時間がかかりましたが、今では数分でできると思います。

DigitalOceanの場合、DigitalOceanクレデンシャルINIファイルへのパスを入力するように求められたときに苦労しました。スクリプトが参照しているのは、 Applications&API ページとそのページのTokens/Keyタブです。 DigitalOceanのAPIの個人アクセストークン(読み取りおよび書き込み)を所有または生成する必要があります。これは65文字の16進数文字列です。次に、この文字列を、certbotを実行しているWebサーバー上のファイルに配置する必要があります。そのファイルの最初の行にコメントを含めることができます(コメントは#で始まります)。 seccond行は次のとおりです。

dns_digitalocean_token = 0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff

DigitalOceanのAPIに読み取り+書き込みトークンを設定する方法を見つけたら、certbotを使用して ワイルドカード証明書 を設定するのは非常に簡単でした。ワイルドカード証明書を設定する必要はありません。代わりに、証明書を適用する各ドメインとサブドメインを指定できます。 DigitalOceanからの個人アクセストークンを含む資格情報INIファイルを必要としたのは、ワイルドカード証明書でした。

公開鍵証明書(ID証明書またはSSL証明書とも呼ばれます)は有効期限が切れ、更新が必要なことに注意してください。したがって、証明書を定期的に(繰り返し)更新する必要があります。 certbotのドキュメントには、 証明書の更新 が含まれています。

私の計画では、opensslコマンドを使用して証明書の有効期限を取得し、有効期限が切れるまで30日以内に更新をトリガーするスクリプトを作成します。次に、このスクリプトをcronに追加し、1日に1回実行します。

証明書の有効期限を読み取るコマンドは次のとおりです。

root@prod-Host:~# /usr/bin/openssl x509 -enddate -noout -in path-to-certificate-pem-file
notAfter=May 25 19:24:12 2019 GMT

ワンライナーバージョン2017:

CentOS:

openssl req -x509 -nodes -sha256 -newkey rsa:2048 \
-keyout localhost.key -out localhost.crt \
-days 3650 \
-subj "CN=localhost" \
-reqexts SAN -extensions SAN \
-config <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=IP:127.0.0.1,DNS:localhost"))

Ubuntu:

openssl req -x509 -nodes -sha256 -newkey rsa:2048 \
-keyout localhost.key -out localhost.crt \
-days 3650 \
-subj "CN=localhost" \
-reqexts SAN -extensions SAN \
-config <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=IP:127.0.0.1,DNS:localhost"))
3
user327843

OpenSSLを使用した _ rsa _ および _ ecdsa _ の自己署名証明書および証明書チェーン作成スクリプトは、こちらから入手できます。

0
rashok