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


130

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

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

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


自己署名証明書をWebブラウザーに対して信頼できるものにすることはできません。信頼できる署名機関によって署名されていません。

1
それは真実ではありません。ルート証明書をインストールして、自己署名証明書を信頼することができます。しかし、私はこれを適切に行うことができないようです。IEで(Chromeではなく)証明書チェーンをインストールできると読みましたので、試してみましたが、まだ認識されていません。localhostが特別なためか、自己署名証明書が正しくないのかはわかりません。
JasonS 2014年

3
Chromeなどのブラウザで動作する自己署名証明書を取得したことがありません。これが私の回避策です。127.0.0.1(localhost)を指すlocal.MYDOMAIN.comのDNSエントリを作成してから、運用証明書を使用します。これは、必ず本番証明書チェーンなどに問題がない作るというメリットがある
JasonS

回答:


86

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

私は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

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

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

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

ステップ4.次に、securityフォルダーの外で、Expressアプリで次のようにします(クレジットは@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.サーバーを起動し、https:// localhost:3000にnode server.js移動します

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

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

ステップ6. ChromeでDev Toolsを開き、[セキュリティ]パネルに移動して、[証明書の表示]をクリックします。 ここに画像の説明を入力してください

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

詳細に移動-ファイルをコピー-エクスポートウィザードの次

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

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

証明書の管理を選択します

ステップ10. Trusted Root Certification Authoritiesパネルに移動し、インポートをクリックします。

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

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

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

セキュリティ例外を確認する

ステップ12.すべてを閉じて、Chromeを再起動します。次に、移動すると、https://localhost:3000次のようになります。 緑が大好き


こんにちは。私が開いたすべての手順を完了するhttps://localhost:3000と、Chromeの読み込みが停止します。誰もがその理由を教えてくれますか?
co.zohar 2018年

@ co.zoharコンソールにメッセージはありますか?crl+shift+iまたはF12を押してコンソールを開きます。
AI

1
ネットワーク上のアドレスに対してこれを行っている場合、証明書DNSを次のようなホスト名に設定していることがわかりました。DNS.1 = server.local 次に、接続マシンでHOSTSファイルを更新して、サーバーのIPアドレスがホスト名を指すようにします。たとえば、次の 192.168.0.50 server.localようになります。証明書とアドレスが一致し、証明書を検証できるようにします。
roskelld

@AIコンソールには何も表示されません。ページには「localhostを待機しています...」と表示されます。hostsファイルで何か設定しましたか?
co.zohar 2018年

1
私は自分の質問に対する半回答を見つけました:たとえば、CNおよびDNS.1を「local.com」のようなものに変更し、サーバーへのアクセスを必要とする各コンピューターで、etc / hostsファイルをローカルを指すように変更します.comをサーバーのIPに、これは動作します。
TKoL

110

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

ペムを生成

> 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)
})
  • https://localhost:3000Google Chromeで開くと、安全でないことがわかります。まだ!
  • 開発者ツール>セキュリティ>証明書の表示:画像をデスクトップにドラッグしてダブルクリックします。
  • 「追加」をクリックします
  • キーチェーンアクセスで見つけてダブルクリックします
  • 「信頼」を展開し、「この証明書を使用するとき」を「常に信頼する」に変更します。
  • 認証を求められる場合があります。
  • サーバーを再起動します。
  • ブラウザを更新します。
  • 楽しい!:)

1
Macで実行する場合の別のリンクは、certsimple.com / blog / localhost-ssl-fixです。
ジョン

綺麗な!これはうまくいった!追加したい:ここからOpenSSLをインストールします:indy.fulgan.com/SSL/?C=M;O=A。ここから.cnfのファイルを取得しますし、その後、ここからそれを設定します。gist.githubusercontent.com/pandurang90/dbe6a67339747ef5bacf/raw/... とのconfigure openSSLのここから:stackoverflow.com/questions/7360602/...
ホセ・A

2
Chrome 58以降でそれを追加したいのですが、「Subject Alternative Name missing」というエラーが表示されます。stackoverflow.com/a/42917227/1057052。詳細なヘルプについては、以下の答えをチェック:stackoverflow.com/a/43666288/1057052stackoverflow.com/a/44398368/1057052
ホセA

14
Drag image to your desktop and double click it->私は自分のデスクトップに何もドラッグできません、ドラッグできません.. image正確に鉱石について何を話しているのですか?
AIon 2017年

7
Chromeの「Subject Alternative Name missing」を克服するopenssl req -newkey rsa:2048 -x509 -nodes -keyout keytmp.pem -new -out cert.pem -subj /CN=localhost -reqexts SAN -extensions SAN -config <(cat /System/Library/OpenSSL/openssl.cnf <(printf '[SAN]\nsubjectAltName=DNS:localhost')) -sha256 -days 3650には、提案した最初の行の代わりに実行できます。そして、これはその過程でより少ない質問をするでしょう...
Michael Litvin

78

openSSLを試して証明書を生成できます。これを見てください。

ノードJSエクスプレスサーバーにHTTPSを追加するには、.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には自己署名証明書がありました。

ただし、すべてのブラウザが接続が信頼できないことを示すエラーをスローしました。続行しますか?[続行]をクリックした後、問題なく動作しました。

誰かが自己署名証明書でこのエラーを回避したことがある場合は、啓発してください。


9
あなたの証明書はまだ信頼されていないので、私が説明しているのと同じ問題があります。Webサービスを適切にテスト/デバッグするには信頼されている必要があります。
JasonS 2014年

1
この証明書をローカルマシンでのみ信頼し、ネットワークでは信頼しないようにしたいですか?

1
回答の上部にあるリンクは1024ビットの3DES暗号化を推奨していますが、これは時代遅れです。よりopenssl genrsa -out key.pem 2048良いキーのために使用する方が良いです。
16

3
証明書はまだ信頼されていません。
Diego Mello

2
上記の高速コードは、(openSSLの代わりに)github.com/FiloSottile/mkcertを使用してローカルCA /信頼できる証明書を作成します。緑色のバーがずっとあります。
som

11

localhost:リンクの SSL証明書を生成する方法

openssl genrsa -des3 -out server.key 1024

ここにパスワードを入力する必要があります。パスワードは次の手順で再入力する必要があります

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

「一般名」を尋ねられたら、次のように入力します:localhost

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

1
これは、過去2時間にわたってインターネットを精査したソリューションです。ubuntuの誰もが移動しcp server.crt /usr/local/share/ca-certificates/.て実行すると、sudo update-ca-certificatesNodeJS 8以降でlocalhost httpsリクエストが機能します。Idも増加1024 to 2048
Salyangoz 2018

6

これが私のために働いているものです

窓に

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. / etc / hostsをsu許可付きで開く
  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/の説明に従って証明書をインポートします


こんにちはトロイ、これを共有してくれてありがとう。これが機能するかどうか、他の誰かがコメントする必要があります。私の回避策:最終的にdev.phantomjscloud.comをhostsファイルに追加してから、本番証明書を使用しました。これは、開発ボックスでプロダクションキーを使用できるようにする場合にのみ役立ちます。したがって、他の誰かが確認できる場合、ソリューションは引き続き有効だと思います
JasonS

ローカルとローカルサーバーをセキュリティで保護し、ローカルと運用サーバーを保護する方法を組み合わせて、私と私のチームで機能します。
TroyWorks 2014年

Windowsの場合、git bashコンソールは、ここからopensslコマンドを使用して適切に機能します。ルート証明書をインストールするだけで、必要に応じて、ルート証明書によって署名された複数のサイト固有の証明書を作成できます。
Jason Goemaat 2017年

6

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

  1. mkcertをインストールします。macOS / Windows / Linuxの手順があります
  2. mkcert -install ローカルCAを作成するには
  3. mkcert localhost 127.0.0.1 ::1 現在のディレクトリにlocalhostの信頼できる証明書を作成するには
  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

とてもうまくいきます!このアプローチでは、自己署名証明書をCAの信頼できる認証局として、chrome / windows証明書ストアに登録する必要はありません。他の回答で述べたように。
zaheer

4

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

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


彼はIEについて言及しています。つまり、彼はWindowsを使用しています。
2ビット

3

nodeを使用している場合は、nodeで生成してみませんか?このモジュールはかなりフル機能のようです:

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


3

投稿された回答の一部には、この問題を克服するためにも私にとって非常に有用な部分があります。ただし、最小数のステップにも関心があり、理想的には(Windows 10では)OpenSSLを回避しました。

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

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

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」モジュールを使用してサーバーをインスタンス化する場合、(「キー」と「証明書」の代わりに)使用するオプションは、次のように「pfx」と「パスフレーズ」になります。

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

2

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

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

私は、MSDNブログのこのガイドの解決策#2を使用しました。opは、MMCを使用する必要があることについての質問のリンクも共有しましたが、これは私にとってはうまくいきました。 解決策#2


2

移動: chrome://flags/

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

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


2

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

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

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

このリソースは、CA証明書とサーバー証明書の両方の作成をカバーし、私のセットアップの結果、localhost Chrome、Firefox、およびEdgeに緑色のバーを表示しました。https//ram.k0a1a.net/self-signed_https_cert_after_chrome_58

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


0

@alonの詳細な手順よりもさらに進んで、自己署名CAを作成する必要がある場合:

https.createServer({
  key: fs.readFileSync(NODE_SSL_KEY),
  cert: fs.readFileSync(NODE_SSL_CERT),
  ca: fs.readFileSync(NODE_SSL_CA),
}, app).listen(PORT, () => {});

package.json

"setup:https": "openssl genrsa -out src/server/ssl/localhost.key 2048
&& openssl req -new -x509 -key src/server/ssl/localhost.key -out src/server/ssl/localhost.crt -config src/server/ssl/localhost.cnf
&& openssl req -new -out src/server/ssl/localhost.csr -config src/server/ssl/localhost.cnf
&& openssl x509 -req -in src/server/ssl/localhost.csr -CA src/server/ssl/localhost.crt -CAkey src/server/ssl/localhost.key -CAcreateserial -out src/server/ssl/ca.crt",

説明に従ってlocalhost.cnfを使用します。

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = UK
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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.