tag:crieit.net,2005:https://crieit.net/tags/HTTPS/feed 「HTTPS」の記事 - Crieit Crieitでタグ「HTTPS」に投稿された最近の記事 2022-07-14T23:32:07+09:00 https://crieit.net/tags/HTTPS/feed tag:crieit.net,2005:PublicArticle/18238 2022-07-14T23:32:07+09:00 2022-07-14T23:32:07+09:00 https://crieit.net/posts/use-clipboard-api-by-react-20220714 React (create-react-app) で Clipboard API にアクセスするために localhost:3000 をhttpsにする <h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/flu_bit/items/659a59260446117e9548">クリップボードにテキストをコピーするボタンの実装 - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://mseeeen.msen.jp/copy-text-to-clipboard-with-javascript-in-2021/">JavaScript でクリップボードにテキストをコピーする (2021年版) | MSeeeeN | 大阪発 IT メディア by MSEN</a></li> </ul> <p>React アプリ(<code>create-react-app</code>(<code>react-scripts</code>))で Clipboard API を使おうとしたところ、次のエラーが発生してしまいました。</p> <blockquote> <p>Uncaught TypeError: Cannot read property ‘writeText’ of undefined ...</p> </blockquote> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://owatata.com/2020/10/06/%E3%80%90javascript%E3%80%91navigator-clipboard-writetex%E3%81%A7-uncaught-typeerror-cannot-read-property-writetext-of-undefined/">【javascript】navigator.clipboard.writeTextで Uncaught TypeError: Cannot read property ‘writeText’ of undefined – オワタ太のブログ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://propg.ee-mall.info/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/javascript/js-http%E7%92%B0%E5%A2%83%E3%81%A7%E3%81%AFnavigator-clipboard-writetext%E3%81%8C%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8B/">[JS] http環境ではnavigator.clipboard.writeTextがエラーになる - プロプログラマ -Flex,Air,C#,Oracle,HTML5+JS-</a></li> </ul> <p>調べてみたところ、 https でないと使用できないようです。</p> <p>そこで通常 <code>npm start</code> で自動起動してくる <code>http://localhost:3000/</code> を <code>https://localhost:3000/</code> にする必要に迫られたので、その方法を書き留めておきます。</p> <h2 id="対処"><a href="#%E5%AF%BE%E5%87%A6">対処</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sutara79/items/21a068494bc3a08a4803">XAMPP for WindowsでSSLを有効にする - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://kdnakt.hatenablog.com/entry/2020/06/07/170000">Create React Appで作成したアプリをローカルのMacBook上でHTTPSで動作させる - kdnakt blog</a></li> </ul> <p>今回は XAMPP の入っているPCでそのオレオレSSL証明書が既にあったので、それを流用します。</p> <p>証明書を <code>server.crt</code>、 秘密鍵を <code>server.key</code> という名前でコピーして、 <code>create-react-app</code> プロジェクト配下に設置します(今回は <code>ssl/</code> ディレクトリを切りました)。</p> <p>次に、 <code>.env</code> に次の3行を足して再度 <code>npm start</code> します。</p> <pre><code>HTTPS=true SSL_CRT_FILE=./ssl/server.crt SSL_KEY_FILE=./ssl/server.key </code></pre> <p>これで <code>https://localhost:3000/</code> でアプリにアクセスでき、無事 Clipboard API も動かすことができました。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <h3 id="Clipboard API"><a href="#Clipboard+API">Clipboard API</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/flu_bit/items/659a59260446117e9548">クリップボードにテキストをコピーするボタンの実装 - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://mseeeen.msen.jp/copy-text-to-clipboard-with-javascript-in-2021/">JavaScript でクリップボードにテキストをコピーする (2021年版) | MSeeeeN | 大阪発 IT メディア by MSEN</a></li> </ul> <h3 id="Uncaught TypeError: Cannot read property ‘writeText’ of undefined"><a href="#Uncaught+TypeError%3A+Cannot+read+property+%E2%80%98writeText%E2%80%99+of+undefined">Uncaught TypeError: Cannot read property ‘writeText’ of undefined</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://owatata.com/2020/10/06/%E3%80%90javascript%E3%80%91navigator-clipboard-writetex%E3%81%A7-uncaught-typeerror-cannot-read-property-writetext-of-undefined/">【javascript】navigator.clipboard.writeTextで Uncaught TypeError: Cannot read property ‘writeText’ of undefined – オワタ太のブログ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://propg.ee-mall.info/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/javascript/js-http%E7%92%B0%E5%A2%83%E3%81%A7%E3%81%AFnavigator-clipboard-writetext%E3%81%8C%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8B/">[JS] http環境ではnavigator.clipboard.writeTextがエラーになる - プロプログラマ -Flex,Air,C#,Oracle,HTML5+JS-</a></li> </ul> <h3 id="https化"><a href="#https%E5%8C%96">https化</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sutara79/items/21a068494bc3a08a4803">XAMPP for WindowsでSSLを有効にする - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://kdnakt.hatenablog.com/entry/2020/06/07/170000">Create React Appで作成したアプリをローカルのMacBook上でHTTPSで動作させる - kdnakt blog</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/17056 2021-05-04T11:55:50+09:00 2021-05-04T11:55:50+09:00 https://crieit.net/posts/Windows-Server-CertReq-CSR Windows Server の CertReq で作成した CSR の文字化けを回避する <p>Windows Server の <code>certreq.exe</code> を使って、 https 等を目的に サーバー証明書署名要求 (CSR) を作成した際に、 その CSR や署名後の CER で、 サブジェクト字が文字化けしてしまう場合がある。</p> <p><a href="https://crieit.now.sh/upload_images/2a94ae5a87f998674df6b4d30b4427bd6090b6a8103f8.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2a94ae5a87f998674df6b4d30b4427bd6090b6a8103f8.png?mw=700" alt="certreq-unicode-00.png" /></a> <a href="https://crieit.now.sh/upload_images/903a4a7899522cbe94fec78c2657d4e96090b6aeb36cc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/903a4a7899522cbe94fec78c2657d4e96090b6aeb36cc.png?mw=700" alt="certreq-unicode-01.png" /></a></p> <p>この問題は、 <code>certreq.exe</code> にて、テキストファイル (.inf ファイル) から CSR を作成した場合に発生する。</p> <p>そしてこれは、 .inf ファイルを BOM付き UTF-16 LE で保存すれば解決する。<br /> (BOM付き/BOMなし の UTF-8 には対応していない)</p> <p><a href="https://crieit.now.sh/upload_images/86fdbbe43a80ce83bd3ac30183fe7f906090b6b15624c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/86fdbbe43a80ce83bd3ac30183fe7f906090b6b15624c.png?mw=700" alt="certreq-unicode-02.png" /></a><br /> Windows のメモ帳であれば、 文字コードを Unicode に設定すれば、 OK だ。</p> <p>対処法は単純だが、原因が少しややこしかったので、少し深堀りしてみる。</p> <h2 id="CSR が文字化けする要因"><a href="#CSR+%E3%81%8C%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%81%99%E3%82%8B%E8%A6%81%E5%9B%A0">CSR が文字化けする要因</a></h2> <p>そもそも、文字化けする要因は以下の3カ所あった。</p> <ol> <li>.inf ファイルが ASCII (Shift_JIS) で保存すると Unicode の情報が失われる</li> <li>certreq.exe が .inf ファイルの文字コードの解決に失敗する</li> <li>X.509 の文字列のエンコードが UTF-8 が指定されていない</li> </ol> <p>(1) はまぁわかりやすいだろう。<br /> テルグ文字や絵文字など、 Shift_JIS に存在しない Unicode の文字が文字化けするのは、これが原因だ。</p> <p>ところが、 古い Windows Server (2012 あたりとか) だったり、 .inf の内容によっては、 非 Shift_JIS 文字だけでなく、 非Ascii 文字 (上のスクショで言うと "京都府" のあたり) も文字化けする場合がある。<br /> これは (1) だけでは説明がつかない。</p> <p>(2) については、 .inf ファイルが Shift_JIS や UTF-8 で保存されていると、 certreq.exe が文字コードの解決を誤ってしまう場合があるのが原因だ。<br /> おそらく、 OS のロケールなどを見て、 BOM付き UTF-16 LE ではないファイルが .inf ファイルに渡されたときの挙動が決まるのだと思われる。</p> <p>この問題も、 .inf ファイルを .inf ファイルを BOM付き UTF-16 LE で保存すれば、文字の解釈が明確になるので、文字化けしなくなる。</p> <p>なお、 (3) については、現行のサポート中の OS では気にする必要はないだろう。 古い OS だと、 HTTPS サーバー証明書の規格である X.509 で、扱う文字列を UTF-8 で記述するバージョンに対応していない可能性がある。</p> <h2 id="サーバー証明書のサブジェクトに顔文字を入れる"><a href="#%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%AE%E3%82%B5%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AB%E9%A1%94%E6%96%87%E5%AD%97%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B">サーバー証明書のサブジェクトに顔文字を入れる</a></h2> <p>試しに、 以下のような内容の <code>request.inf</code> ファイルを、 BOM付き UTF-16 LE で保存して、 certreq.exe で CSR ファイルを作成してみよう。</p> <pre><code class="text">[NewRequest] Subject = "CN=(´◉◞౪◟◉); OU=🥺; O=aquasoftware.net; L=京都市; ST=京都府; C=JP; [email protected]" X500nameflags = "CERT_NAME_STR_SEMICOLON_FLAG" KeyLength = 3072 KeySpec = AT_KEYEXCHANGE KeyUsage = "CERT_DIGITAL_SIGNATURE_KEY_USAGE | CERT_KEY_ENCIPHERMENT_KEY_USAGE" HashAlgorithm = sha256 MachineKeySet = True ProviderName = "Microsoft RSA SChannel Cryptographic Provider" ProviderType = 12 RequestType = CMC [EnhancedKeyUsageExtension] OID=1.3.6.1.5.5.7.3.1 [Extensions] 2.5.29.17="{text}" _continue_ = "DNS=aaa.example.com&" _continue_ = "DNS=bbb.example.com&" _continue_ = "IPAddress=192.0.2.1&" _continue_ = "IPAddress=192.0.2.2" </code></pre> <pre><code class="console">PS> certreq.exe -new .\request.inf .\csr.req CertReq: 要求が作成されました </code></pre> <p>.inf ファイルの書き方については、 <a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/certreq_1">certreq | Microsoft Docs</a> のドキュメントを参照のこと。<br /> いくつか特徴的な部分について解説しておくと、</p> <ul> <li>Subject 内のパラメーターに <code>","</code> が使えるよう、 <code>X500nameflags</code> に <code>CERT_NAME_STR_SEMICOLON_FLAG</code> を指定して、区切りを <code>";"</code> に変更している。</li> <li><code>OID=1.3.6.1.5.5.7.3.1</code> の部分では、「拡張キー使用法」に「サーバー認証」の仕組みを与えている。</li> <li><code>[Extensions]2.5.29.17=...</code> の部分では、 SubjectAltName (SAN) に、 DNS や IpAddress を指定している。 SAN の指定がないと、 Chrome で証明書エラーになってしまうため。</li> </ul> <p>これを CA で署名してもらってサーバー証明書として使えば、サーバー証明書内で絵文字ですら使えるようになる。</p> <p><a href="https://crieit.now.sh/upload_images/6cb04d4d5eacfaa773cbe305c0c9f30e6090b6b40a165.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6cb04d4d5eacfaa773cbe305c0c9f30e6090b6b40a165.png?mw=700" alt="certreq-unicode-03.png" /></a> <a href="https://crieit.now.sh/upload_images/8ff19ca50b52e7e778d73072cb57cf9c6090b6b70a776.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8ff19ca50b52e7e778d73072cb57cf9c6090b6b70a776.png?mw=700" alt="certreq-unicode-04.png" /></a></p> advanceboy tag:crieit.net,2005:PublicArticle/15868 2020-04-25T02:52:35+09:00 2020-04-26T16:32:05+09:00 https://crieit.net/posts/VPS-HTTP-80-HTTPS-443 VPSを引っ越したらHTTP(80)は繋がるがHTTPS(443)は繋がらなくなった原因 <h1 id="原因"><a href="#%E5%8E%9F%E5%9B%A0">原因</a></h1> <p>sslhの設定のIPアドレスが古いVPNのもののままだったせいでした。<br /> 新しいVPSのIPアドレスに修正したら直りました。</p> <h1 id="現象"><a href="#%E7%8F%BE%E8%B1%A1">現象</a></h1> <p>VPSを引っ越したらHTTP(80)は繋がるがHTTPS(443)は繋がらなくなりました。<br /> IPアドレスを指定しても、HTTPは繋がるのにHTTPSは<code>connection refused</code>になってしまいました。<br /> Webサーバーにsshでログインして、<code>curl https://localhost</code>を実行しても<code>connection refused</code>になるので、ufwなどを疑い無効にしてみたりしましたが、現象は変わらずHTTPSだけが問題で、他は問題なしでした。<br /> 結局、<code>grep -nr 443 /etc</code>で設定をさらったら、<code>/etc/default/sslh</code>が引っかかって、sslhのインストールしたことを思い出したのでした。</p> <h1 id="sslhとは?"><a href="#sslh%E3%81%A8%E3%81%AF%EF%BC%9F">sslhとは?</a></h1> <p>sslポート(443)などに、sshなどのプロトコルでも接続できるようにしてくれる、プロトコル多重化サーバーです。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.rutschle.net/tech/sslh/README.html">sslh – A ssl/ssh multiplexer</a></p> 真田 保