web-dev-qa-db-ja.com

localhostの信頼できる自己署名SSL証明書を作成する(Express / Nodeで使用するため)

Localhostで使用する自己署名証明書の作成に関するさまざまな指示に従うことを試みます。指示のほとんどはIIS用のようですが、Nodejs/Expressを使用しようとしています。証明書はインストールされますが、信頼されていないため、どれも正しく機能しません。ここで私が試したのは失敗します:

誰かがこれを行うことができるワークフローを提供できますか? 証明書をインストールすることはできますが、chrome(v32)または_のいずれかで信頼される証明書を取得できませんIE(v10)。

編集:コメントでは、問題は信頼できる証明書ルートではないことが示唆されました。 IEを介して証明書をインストールしましたが、まだ信頼されていません。

106
JasonS

上記の答えは部分的でした。私はこれを機能させるために多くの時間を費やしました、それは非常識です。私の将来に注意してください、あなたがする必要があるものはここにあります:

私はWindows 10でChrome 65を使用しています。Firefoxは正常に動作しています-ローカルホストをセキュリティ例外として確認するだけで動作します。 Chromeはしません:

ステップ1。バックエンドで、securityというフォルダーを作成します。内部で作業します。

ステップ2。次のコンテンツでreq.cnfという名前のリクエスト設定ファイルを作成します(クレジットは次の場所に移動します: @ Anshul

req.cnf:

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
Prompt = no
[req_distinguished_name]
C = Country initials like US, RO, GE
ST = State
L = Location
O = Organization Name
OU = Organizational Unit 
CN = www.localhost.com
[v3_req]
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.localhost.com
DNS.2 = localhost.com
DNS.3 = localhost

このフィールドの説明は here です。

ステップ3。端末のセキュリティフォルダーに移動し、次のコマンドを入力します。

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

ステップ4。その後、securityフォルダーの外で、エクスプレスアプリで次のようにします(クレジットは@Diego Melloに送られます)

backend 
 /security
 /server.js

server.js:

const express = require('express')
const app = express()
const https = require('https')
const fs = require('fs')
const port = 3000

app.get('/', (req, res) => {
    res.send("IT'S WORKING!")
})

const httpsOptions = {
    key: fs.readFileSync('./security/cert.key'),
    cert: fs.readFileSync('./security/cert.pem')
}
const server = https.createServer(httpsOptions, app)
    .listen(port, () => {
        console.log('server running at ' + port)
    })

ステップ5サーバーnode server.jsを起動し、 https:// localhost:30 に移動します。

この時点で、サーバーのセットアップは完了です。ただし、ブラウザには警告メッセージが表示されます。

chrome/windows証明書ストアに、CAの信頼できる認証局として自己署名証明書を登録する必要があります。(chromeはこれもwindowsに保存します)

ステップ6。 ChromeでDev Toolsを開き、[セキュリティ]パネルに移動して、[証明書の表示]をクリックします。 enter image description here

ステップ7。 [詳細]パネルに移動し、[ファイルのコピー]をクリックして、証明書のエクスポートWizardが表示されたら、次のように[次へ]をクリックします。

go to details - copy file - next on export wizard

ステップ8。 DERエンコードを終了し、[次へ]をクリックして、Browseを選択し、デスクトップなどのアクセスしやすいフォルダーに配置して、証明書にlocalhost.cer, then click Save and then Finish.という名前を付けます。デスクトップで証明書を確認できるはずです。

ステップ9。 URLボックスに挿入してchrome://settings/を開きます。下のAdvanced / Advanced Optionsをクリックしてから、下にスクロールしてManage Certificatesを見つけます。

choose manage certificates

ステップ10。 [信頼されたルート証明機関]パネルに移動し、[インポート]をクリックします。

Go to Trusted Root Certification Authorities panel, and click import

手順8でエクスポートが完了したlocalhost.cer証明書をインポートします。

ステップ11。 [参照]をクリックし、localhost.cerを見つけ、デフォルト値のまま何回もクリックします。この警告が表示されるまで[はい]をクリックします。

confirm security exception

ステップ12。すべてを閉じて、chromeを再起動します。次に、https://localhost:3000に移動すると、次のように表示されます。 gotta love the green

42
AIon

最短の方法 MacOSでテスト済みですが、他のOSでも同様に動作する可能性があります。

PEMを生成

> openssl req -x509 -newkey rsa:2048 -keyout keytmp.pem -out cert.pem -days 365

> openssl rsa -in keytmp.pem -out key.pem

エクスプレスサーバー

const express = require('express')
const app = express()
const https = require('https')
const fs = require('fs')
const port = 3000

app.get('/', (req, res) => {
  res.send('WORKING!')
})

const httpsOptions = {
  key: fs.readFileSync('./key.pem'),
  cert: fs.readFileSync('./cert.pem')
}
const server = https.createServer(httpsOptions, app).listen(port, () => {
  console.log('server running at ' + port)
})
  • Google Chromeでhttps://localhost:3000を開くと、安全ではないことがわかります。まだ!
  • 開発者ツール>セキュリティ>証明書の表示:画像をデスクトップにドラッグし、ダブルクリックします。
  • 「追加」をクリックします
  • キーチェーンアクセスで見つけてダブルクリックします
  • 「信頼」を展開し、「この証明書を使用する場合」を「常に信頼する」に変更します。
  • 認証を求められる場合があります。
  • サーバーを再起動します。
  • ブラウザを更新します。
  • 楽しい! :)
95
Diego Mello

OpenSSLを試して証明書を生成できます。 this を見てください。

HTTPSをノードJSエクスプレスサーバーに追加するには、.keyファイルと.crtファイルが必要になります。これを生成したら、このコードを使用してHTTPSをサーバーに追加します。

var https = require('https');
var fs = require('fs');
var express = require('express');

var options = {
    key: fs.readFileSync('/etc/Apache2/ssl/server.key'),
    cert: fs.readFileSync('/etc/Apache2/ssl/server.crt'),
    requestCert: false,
    rejectUnauthorized: false
};


var app = express();

var server = https.createServer(options, app).listen(3000, function(){
    console.log("server started at port 3000");
});

これは、ローカルマシンおよびこれを展開したサーバーで正常に機能しています。サーバーにあるものはgoDaddyから購入しましたが、localhostには自己署名証明書がありました。

ただし、すべてのブラウザーが接続が信頼されていないというエラーをスローしました。続行しますか? [続行]をクリックすると、正常に機能しました。

誰かが自己署名証明書でこのエラーを回避したことがあるなら、教えてください。

77
user1741851

LocalhostのSSL証明書を生成する方法: link

openssl genrsa -des3 -out server.key 1024

ここにpasswordを入力する必要があり、次の手順で再入力する必要があります

openssl req -new -key server.key -out server.csr

「共通名」と入力された場合:localhost

openssl x509 -req -days 1024 -in server.csr -signkey server.key -out server.crt
11
fuma

ここに私のために働いているものがあります

窓の上

1)これを%WINDIR%\ System32\drivers\etc\hostsファイルに追加します:127.0.0.1 localdev.YOURSITE.net(ブラウザーに問題があるため) 「localhost」(クロスオリジンスクリプト用)

Windows VistaおよびWindows 7 VistaおよびWindows 7はユーザーアカウント制御(UAC)を使用するため、メモ帳は管理者として実行する必要があります。

  1. [スタート]-> [すべてのプログラム]-> [アクセサリ]をクリックします

  2. メモ帳を右クリックし、[管理者として実行]を選択します

  3. [Windowsには許可が必要です] UACウィンドウで[続行]をクリックします。

  4. メモ帳が開いたら、[ファイル]-> [開く]をクリックします。

  5. ファイル名フィールドにC:\ Windows\System32\Drivers\etc\hostsと入力します

  6. 開くをクリックします

  7. これを%WINDIR%\ System32\drivers\etc\hostsファイルに追加します:127.0.0.1 localdev.YOURSITE.net

  8. 保存する

  9. ブラウザを閉じて再起動します

MacまたはLinuxの場合:

  1. suパーミッションで/ etc/hostsを開きます
  2. 127.0.0.1 localdev.YOURSITE.netを追加
  3. それを保存

開発時には、localhostの代わりにlocaldev.YOURSITE.netを使用するため、IDEで実行/デバッグ構成を使用している場合は、必ず更新してください。

Cookiemを作成するときは、「。YOURSITE.net」をcookiedomainとして(先頭にドットを付けて)使用すると、すべてのサブドメインで機能します。

2)そのlocaldev.urlを使用して証明書を作成します

ヒント:Windowsで証明書の生成に問題がある場合は、代わりにVirtualBoxまたはVmwareマシンを使用してください。

3)http://www.charlesproxy.com/documentation/using-charles/sslで説明されているように証明書をインポートします-certificates /

6
TroyWorks

OSX/Chromeを使用している場合は、ここで説明するように、自己署名SSL証明書をシステムキーチェーンに追加できます。 http://www.robpeck.com/2010/10/google-chrome-mac-os -x-and-self-signed-ssl-certificates

それは手動のプロセスですが、ようやく機能するようになりました。共通名(CN)が「localhost」(ポートなし)に設定されていることを確認し、証明書を追加した後、証明書のすべての信頼オプションが「常に信頼」に設定されていることを確認してください。また、「ログイン」キーチェーンではなく、「システム」キーチェーンに追加してください。

4
Vijay Rudraraju

ノードを使用している場合、ノードでそれらを生成してみませんか?このモジュールはかなり充実しているようです:

その場で生成しないことに注意してください。何らかのビルドスクリプトを使用して生成し、一貫した証明書とキーを取得します。それ以外の場合は、毎回新しく生成された自己署名証明書を認証する必要があります。

3
B T

windowsでは、MMC(start> run> mmc)を使用してiis開発証明書を信頼してから、証明書スナップインを追加し、「ローカルコンピューター」を選択してデフォルトを受け入れます。証明書のスナップショットが追加されたら、ローカルコンピューターの証明書ツリーを展開して、[個人]の下にあるlocalhost証明書を選択し、右クリック> [すべてのタスク]> [エクスポート]をクリックします。エクスポートウィザードですべてのデフォルトを受け入れます。

そのファイルを保存したら、信頼できる証明書を展開し、エクスポートしたばかりの証明書のインポートを開始します。 https://localhostはchromeで信頼され、セキュリティ警告はありません。

私はこのガイドを使用しました 解像度#2 MSDNブログから、操作者はMMCを使用する必要があるという彼の質問へのリンクも共有しましたが、これはうまくいきました。 解像度#2

2
mushcraft

これにはさらに多くの側面があります。

自己署名の有無にかかわらず、証明書を使用してTLSを実現できます(SSLを使い続ける人もいます)。

自己署名証明書の緑色のバーを表示するには、認証局(CA)になる必要もあります。この側面は、私のローカル開発セットアップで緑色のバーを達成するための旅で見つけたほとんどのリソースにはありません。 CAになることは、証明書を作成するのと同じくらい簡単です。

このリソースは、CA証明書とサーバー証明書の両方の作成をカバーし、localhost Chrome、Firefox、およびEdgeに緑色のバーを表示するように設定しました。 https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58 =

注:Chromeでは、CA証明書を信頼できる機関に追加する必要があります。

2
Jos

移動先:chrome://flags/

有効:ローカルホストからロードされたリソースに対して無効な証明書を許可します。

緑色のセキュリティはありませんが、クロムでは https:// localhost が常に許可されています。

1
Alphapage

Mkcert @FiloSottileを使用すると、このプロセスが非常に簡単になります。

  1. インストール mkcert 、macOS/Windows/Linuxの手順があります
  2. mkcert -installはローカルCAを作成します
  3. mkcert localhost 127.0.0.1 ::1は、現在のディレクトリにローカルホストの信頼できる証明書を作成します
  4. (システムルートストアを使用しない)ノードを使用しているため、環境変数で CAを明示的に指定 する必要があります。例:export NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"
  5. 最後に、他のさまざまな回答で説明されているセットアップを使用してエクスプレスサーバーを実行します(例:以下)
  6. ブーム。ローカルホストは緑で泳いでいます。

基本的なノード設定:

const https = require('https');
const fs = require('fs');
const express = require('express');

const app = express();    
const server = https.createServer({
    key: fs.readFileSync('/XXX/localhost+2-key.pem'), // where's me key?
    cert: fs.readFileSync('/XXX/localhost+2.pem'), // where's me cert?
    requestCert: false,
    rejectUnauthorized: false,
}, app).listen(10443); // get creative
1
som

投稿された回答の一部には、この問題を克服するのに非常に役立つ部分があります。ただし、minimumのステップ数に興味があり、理想的には、OpenSSLを回避します(Windows 10)。

そのため、回答の重要な部分(クレジット:@ TroyWorks )は、HOSTSファイルを編集して架空のサーバーを作成し、127.0.0.1にマッピングする必要があることです。これは、ローカル開発を行うことを想定しています。

私の場合、SS証明書を使用してNodeJSのWebSocketを保護し、そのソケットは(ブラウザー経由ではなく)プログラムで接続されていました。だから、私にとっては、警告やエラーなしで証明書を受け入れることが重要であり、重要な部分は、適切なCNで証明書を作成することでした(そしてもちろん、答えに記載されているように、信頼できる機関に証明書を受け入れます) 。 IISを使用して自己署名証明書を作成しても適切なCNが作成されないため、Powershellを使用して次のsimpleコマンドを発見しました:

New-SelfSignedCertificate -DnsName "gandalf.dummy.dev" -FriendlyName "gandalf" -CertStoreLocation "cert:\LocalMachine\My"

これはPS管理コンソールで実行する必要がありますが、動作するだけで、証明書をLocalMachine証明書ストアの「個人」セクションに配置します。次のコマンドを実行して、作成されたことを確認できます。

ls cert:\LocalMachine\My 

信頼するには、これをコピーして、証明書マネージャーを使用して「信頼されたルート証明機関」に貼り付けます(現在のユーザーではなく、ローカルマシンの証明書を確認してください!)。

IISでこの証明書にバインドすると、 https://gandalf.dummy.dev/ をヒットして、警告なしで安全な接続を取得できるはずです。

NodeJSでこれを使用する最後の部分は、上記および他のSOの回答で説明されているため、Windowsでのみ追加します。証明書と秘密キーを組み合わせたpfxファイルで作業する方が簡単です。証明書マネージャーからpfxを簡単にエクスポートできますが、NodeJSでの使用方法に影響します。 「https」モジュールを使用してサーバーをインスタンス化する場合、(「key」および「cert」の代わりに)使用するオプションは「pfx」および「passphrase」になります。

var https = require('https');
var options = { 
    pfx: fs.readFileSync('mypfxfile'), 
    passphrase: 'foo' 
};
var server = https.createServer(options);
1
tomo