none
クライアント証明書のストア先がGUIとコマンドラインで違うので、合わせるようにするにはどうすればよいのでしょうか。 RRS feed

  • 質問

  • いつもお世話になっております。

    Windows10の設定の自動化を行うにあたり、各種情報の自動登録の一環として、証明書のコマンドでのインストールを実現したいと思います。

    「example.p12」という証明書を作成し、目的通りのことができるかを確認するため、一連の作業をGUIで検証したところ、「証明書のインポートウィザード」で、保存場所を「ローカルコンピューター」を指定することでうまくいくことが確認できました。この手順では、証明書は「信頼されたルート証明機関」に登録されています。

    これをコマンドラインで以下のように記述し、同様にインストールできるかを検証しました。

    CertUtil -f -p password -importPFX example.p12 noExport

    すると、証明書は「信頼された発行元」のほうにインストールされているようで、「信頼されたルート証明機関」には表示されtませんでした。

    この差がこの後の手順にどの程度影響を及ぼすのかはこれからの検証なのですが、コマンドラインで証明書をインストールしても、GUIと同様に「信頼されたルート証明機関」のほうで表示されるようにするにはどうすればよろしいでしょうか。

    ご存知の方がいらっしゃいましたらお教えください。

    2017年1月17日 6:32

回答

  • チャブーンです。

    残念ながら、certutilコマンドで、指定した証明書ストアにpfxファイルをインポートする機能はありません。ムリにこだわらずPowerShellのImport-PfxCertificateコマンドレットを使ってみてはいかがでしょうか?

    https://technet.microsoft.com/ja-jp/library/hh848625.aspx

    何が何でもcmdコマンドということであれば、したのページにあるようなサードパーティツールを使うことになります。

    http://stackoverflow.com/questions/5171117/import-pfx-file-into-particular-certificate-store-from-command-line


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2017年1月17日 6:56
  • チャブーンです。

    この件ですが、GUIでインストールされた証明書ストアは[ローカルコンピューター\信頼されたルート証明機関]である、ということがわかっているのですよね?

    であるなら、以下のスクリプトで[ローカルコンピューター\信頼されたルート証明機関]にインポートできます。

    $str_path = (Convert-Path .)
    $passwd = ConvertTo-SecureString  -String "パスワード文字列" -Force –AsPlainText
    Import-PfxCertificate -FilePath $str_path\example.p12 -CertStoreLocation cert:\LocalMachine\Root -Password $passwd 

    GUIでは複数の証明書ストアにインポートされることはないと思いますが、どうしても確認したいならインポートした証明書の拇印を確認したうえ、これをキーに検索をかけることでわかると思います。

    Get-Childitem cert:\ -recurse |where {$_.Thumbprint -eq "<拇印>"}


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


    2017年1月18日 12:02
  • チャブーンです。

    すみません。私が書いたコードですが、質問者さんが質問で書かれていたものと同じだったので、回答時に流用させていただいていました。

    その中でパスワードを格納した$passwdが、誤って$pawsswdとして参照されていたので、null扱いになっていたのでしょう。

    コードを修正しましたので、試してみてください。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2017年1月19日 2:54
  • チャブーンです。

    ここで、証明書の使い道を先に説明すると、無線LAN接続をEAP-TLSによる接続として、

    ということですが、インポートする証明書はEAP-TLS用のコンピュータ証明書(秘密鍵つき)ということでしょうか?また、AD CSエンタープライズ証明機関で作成したものではなく、個別に作成(いわゆる自己証明書)したものなのでしょうか?

    自己証明書の場合、[ローカルコンピューター\信頼されたルート証明機関]と[ローカルコンピューター\個人]証明書ストアに同じ証明書をインポートする必要があります。[ローカルコンピューター\個人]の証明書ストアのパスは"cert:\LocalMachine\My"ですので、そこにも証明書をインポートするよう、スクリプトに追加してみてはどうでしょうか。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


    2017年1月19日 4:42
  • チャブーンです。

    ひとまず「無線LANが接続できない」理由を確認したほうがいいと思います。

    イベントログの[アプリケーションとサービスログ]-[Microsoft]-[Windows]-[WLAN-Autoconfig]のOperationalイベントのエラーイベントに接続できない理由が書いてあるはずです。それを基に対応するとよいと思います。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2017年1月20日 1:18
  • チャブーンです。

    このネットワークに接続できません\n認証に必要なサーバー上のルート証明書が証明書ストアで見つかりません。その結果、このコンピューターでネットワークは信頼されません。

    これですが、クライアント側に「有効なルート証明書がない」という意味になります。

    念のため伺いますが、本当に「自己(署名)証明書」なのでしょうか?具体的に作成した方法を教えてください(コマンドであればコマンドを聞いた方が早いです)。おそらくは証明機関(WindowsかもしれませんしOpenSSLかもしれませんが)から「単に手動で発行した」ものではないでしょうか?

    自己証明書は自分自身の証明書がルート証明書とコンピュータ証明書を兼任しますが、証明機関から発行されたものはルート証明書とコンピュータ証明書は別になります。ただしp12やpfxの場合にはチェーン証明書であるルート証明書をいっしょに含むことができます。

    GUIの場合、上記のインポート時にルート証明書が自動的にインストールされます。非GUIの場合、この動作に差異があるのかもしれませんね。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


    2017年1月21日 15:39
  • チャブーンです。

    時間が空いてしまいました。

    ひとまず証明書の出処は理解しました。Windows証明機関からは発行されたものではなくOpenSSLで構成した証明機関から、単に手動で発行した、と思います。

    http://unixlife.jp/linux/centos-5/openssl.html

    コマンド内容からルート証明書とコンピュータ証明書を同梱させたp12ファイルと理解しましたが、1コマンドで両証明書を同時に配置する、というコマンドはないように思います。

    おそらく確実なのは、ルート証明書のみをp12とは別に取得し、コンピュータ証明書(それぞれ発行)は個人ストアにインストール、ルート証明書(.cer形式)は信頼された証明機関ストアにインストールするコマンドをそれぞれ行うことです。

    ルート証明書については、CA単位で同一(つまりコンピュータごとのp12証明書を発行してもすべて共通)ですので、ひとまずWindowsにGUIでp12証明書を一度インストールし、そのあと[ローカルコンピューター]\[信頼されたルート証明機関]からエクスポートしたものを、全台に対して使ってみてください。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


    2017年2月4日 6:17

すべての返信

  • チャブーンです。

    残念ながら、certutilコマンドで、指定した証明書ストアにpfxファイルをインポートする機能はありません。ムリにこだわらずPowerShellのImport-PfxCertificateコマンドレットを使ってみてはいかがでしょうか?

    https://technet.microsoft.com/ja-jp/library/hh848625.aspx

    何が何でもcmdコマンドということであれば、したのページにあるようなサードパーティツールを使うことになります。

    http://stackoverflow.com/questions/5171117/import-pfx-file-into-particular-certificate-store-from-command-line


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2017年1月17日 6:56
  • チャブーンさま

    回答ありがとうございました。

    ついでといってはなんですが教えていただきたいことがあります。

    GUIで証明書をインストールしたのち、設定作業を行って問題ないことが確認できましたので、お教えの通り、PowerShellのImport-PfxCertificateコマンドレットを使って証明書をインストールしたいと思います。

    この時、証明書をインストールする手順は

    1.cert:の下を巡回し、インストールされた場所を探す(GUIでインストールする際、複数個所にインストールされるのかは現時点では不明)

    2.Import-PfxCertificateコマンドレットを使い、以下のようにコマンドを構成したスクリプトファイルを作成する。

    スクリプトファイル始まり-------

    $str_path = (Convert-Path .)

    $passwd = ConvertTo-SecureString -String "パスワード文字列" -Force –AsPlainText

    Import-PfxCertificate -FilePath $str_path\example.p12 -CertStoreLocation cert:[証明書がインストールされた場所] -Password $pawsswd

    スクリプトファイル終わり-------

    3.PowerShellでスクリプトの実行権を与え、実行してインストールする

    という順序でよろしいのでしょうか。

    特に、GUIでインストールした証明書の場所をPowerShellでどうやって指定するのかが今の時点でよく分かっておりません。

    お忙しいかと思いますがよろしくお願いいたします。

    2017年1月18日 7:54
  • チャブーンです。

    この件ですが、GUIでインストールされた証明書ストアは[ローカルコンピューター\信頼されたルート証明機関]である、ということがわかっているのですよね?

    であるなら、以下のスクリプトで[ローカルコンピューター\信頼されたルート証明機関]にインポートできます。

    $str_path = (Convert-Path .)
    $passwd = ConvertTo-SecureString  -String "パスワード文字列" -Force –AsPlainText
    Import-PfxCertificate -FilePath $str_path\example.p12 -CertStoreLocation cert:\LocalMachine\Root -Password $passwd 

    GUIでは複数の証明書ストアにインポートされることはないと思いますが、どうしても確認したいならインポートした証明書の拇印を確認したうえ、これをキーに検索をかけることでわかると思います。

    Get-Childitem cert:\ -recurse |where {$_.Thumbprint -eq "<拇印>"}


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


    2017年1月18日 12:02
  • チャブーンさま

    回答ありがとうございました。

    結果を言うと、以下の例外が出てうまくいかない状況です。

    -----------

    Import-PfxCertificate : インポートしようとしている PFX ファイルには、別のパスワ
    ード、またはそのファイルを保護している Active Directory プリンシパルのメンバー
    シップが必要です。
    発生場所 CertInst.ps1:3 文字:1
    + Import-PfxCertificate -FilePath $str_path\example.p12 -CertSto ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [Import-PfxCertificate], Win32
       Exception
        + FullyQualifiedErrorId : System.ComponentModel.Win32Exception,Microsoft.C
       ertificateServices.Commands.ImportPfxCertificate

    -----------

    おそらくは、以下に入れるパスワードが問題かと思っていますが、ここで入れるパスワードはGUIで証明書をインストールする際のパスワードでよいのでしょうか。

    $passwd = ConvertTo-SecureString  -String "パスワード文字列" -Force AsPl

    何度も申し訳ありませんがよろしくお願いいたします。

    2017年1月19日 2:35
  • チャブーンです。

    すみません。私が書いたコードですが、質問者さんが質問で書かれていたものと同じだったので、回答時に流用させていただいていました。

    その中でパスワードを格納した$passwdが、誤って$pawsswdとして参照されていたので、null扱いになっていたのでしょう。

    コードを修正しましたので、試してみてください。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2017年1月19日 2:54
  • チャブーンさま

    回答ありがとうございました。

    Import-PfxCertificate による証明書のインストールに関しては解決しました。

    私のチョンボで申し訳ありませんでした。

    ただ、また新たな問題も出てきました。

    Import-PfxCertificateコマンドレット で追加した証明書を使おうとしても使えない状況です。

    ここで、証明書の使い道を先に説明すると、無線LAN接続をEAP-TLSによる接続として、端末の証明書をImport-PfxCertificateコマンドレットで追加し、netshコマンドでSSIDを登録するという一連の流れをコマンドプロンプトで実現しようとしておりました。なお、SSIDを登録するために必要な情報は、証明書をGUIでインストールした後、手作業でSSIDを登録・接続を確認したのちに、netshコマンドで設定をxmlファイルにエクスポートしたもので、バッチファイルで追加・接続ができることまでは確認しています。

    先にも書いたとおり、GUIで追加すると証明書の場所は[ローカルコンピューター\信頼されたルート証明機関]ですので、チャブーンさまの例示の通りにすることで追加が完了しました。

    この後、netshコマンドでSSIDの登録をするバッチファイルを実行すると、SSIDは登録されるのですが、残念ながら無線LANの接続はできませんでした。出てくるメッセージとしては「証明書がないので接続できませんでした」というようなメッセージが出ています。

    気休めで、私の最初の質問にあるCertUtilコマンドで証明書をインストールすると問題なく無線LAN接続ができるようになりました。このコマンドでインポートした証明書の場所は[ローカルコンピューター\信頼された発行元]にあります。

    ここでの質問ですが、同じ証明書のファイルをCertUtilコマンドとImport-PfxCertificateコマンドレットで登録した場合、証明書に何らかの違いが出るものなのでしょうか。

    お手間をおかけして申し訳ございませんが、ご存知の方がいらっしゃいましたらご回答のほどお願いいたします。


    • 編集済み SCC_ST 2017年1月19日 4:32
    2017年1月19日 4:28
  • チャブーンです。

    ここで、証明書の使い道を先に説明すると、無線LAN接続をEAP-TLSによる接続として、

    ということですが、インポートする証明書はEAP-TLS用のコンピュータ証明書(秘密鍵つき)ということでしょうか?また、AD CSエンタープライズ証明機関で作成したものではなく、個別に作成(いわゆる自己証明書)したものなのでしょうか?

    自己証明書の場合、[ローカルコンピューター\信頼されたルート証明機関]と[ローカルコンピューター\個人]証明書ストアに同じ証明書をインポートする必要があります。[ローカルコンピューター\個人]の証明書ストアのパスは"cert:\LocalMachine\My"ですので、そこにも証明書をインポートするよう、スクリプトに追加してみてはどうでしょうか。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


    2017年1月19日 4:42
  • チャブーンさま

    回答ありがとうございました。

    自己証明書でしたので、アドバイス通り、"cert:\LocalMachine\My"にもインポートしてみました。ですが、「証明書がないので接続できませんでした」のようなメッセージは出なくなったのですが、無線LANのほうは接続試行中のままで先に進まないといった状況となりました。

    検索しているとこんなものがあって、もしかするとGUIでインストールした場合とコマンドレットでインストールした場合とで何か違うことがあるのでしょうか。

    https://stuncloud.wordpress.com/2015/04/02/client_certificate_imported_programmatically_now_not_working_on_my_ie11/

    2017年1月19日 8:42
  • チャブーンです。

    ひとまず「無線LANが接続できない」理由を確認したほうがいいと思います。

    イベントログの[アプリケーションとサービスログ]-[Microsoft]-[Windows]-[WLAN-Autoconfig]のOperationalイベントのエラーイベントに接続できない理由が書いてあるはずです。それを基に対応するとよいと思います。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2017年1月20日 1:18
  • チャブーンさま

    回答ありがとうございました。

    いよいよ私の手に負える領域ではなくなりそうで焦っています。

    イベントビューアを確認したところ、以下のメッセージがありました(ネットワークにつながっていない関係でコピペではなく手入力しています)。

    「このネットワークに接続できません\n認証に必要なサーバー上のルート証明書が証明書ストアで見つかりません。その結果、このコンピューターでネットワークは信頼されません。

    EAP エラー :0x08042400」

    GUIでインポートした証明書のファイルの拡張子は「p12」だけですが、コマンドレットを使う場合はもしかするとほかのこともやらないといけないのではと思っています。ただ、それが何かというのが分からない状況です。

    2017年1月20日 2:39
  • チャブーンです。

    このネットワークに接続できません\n認証に必要なサーバー上のルート証明書が証明書ストアで見つかりません。その結果、このコンピューターでネットワークは信頼されません。

    これですが、クライアント側に「有効なルート証明書がない」という意味になります。

    念のため伺いますが、本当に「自己(署名)証明書」なのでしょうか?具体的に作成した方法を教えてください(コマンドであればコマンドを聞いた方が早いです)。おそらくは証明機関(WindowsかもしれませんしOpenSSLかもしれませんが)から「単に手動で発行した」ものではないでしょうか?

    自己証明書は自分自身の証明書がルート証明書とコンピュータ証明書を兼任しますが、証明機関から発行されたものはルート証明書とコンピュータ証明書は別になります。ただしp12やpfxの場合にはチェーン証明書であるルート証明書をいっしょに含むことができます。

    GUIの場合、上記のインポート時にルート証明書が自動的にインストールされます。非GUIの場合、この動作に差異があるのかもしれませんね。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


    2017年1月21日 15:39
  • チャブーンさま

    回答ありがとうございました。
    実は今回使用している証明書はかなり前に作ったもので、私が作ったものではないというのもあり、おぼろげながらの記録を頼りに過去の情報を探ったのですが、おそらくは以下URLにある手順を参考にしたものだと思います。

    http://www.ktjdragon.com/ktj/ktjs-blog/freebsdwpa2-epa8a8d8a3c

    この手順を参考に、最後に以下コマンドで証明書を作成しています。※これだけは記録がありました。
    # openssl pkcs12 -export -inkey example_key.pem -in example_cert.pem -certfile /etc/pki/CA/cacert.pem -out example.p12

    これだと、言われる通り「単に手動で発行した」証明書ということなのでしょう。

    そうなると、これまでご教示いただいた手順でインポートした証明書を利用して、RADIUS認証できるかどうかを確認していったほうが早いような気がしてきました。

    2017年2月1日 2:11
  • チャブーンです。

    時間が空いてしまいました。

    ひとまず証明書の出処は理解しました。Windows証明機関からは発行されたものではなくOpenSSLで構成した証明機関から、単に手動で発行した、と思います。

    http://unixlife.jp/linux/centos-5/openssl.html

    コマンド内容からルート証明書とコンピュータ証明書を同梱させたp12ファイルと理解しましたが、1コマンドで両証明書を同時に配置する、というコマンドはないように思います。

    おそらく確実なのは、ルート証明書のみをp12とは別に取得し、コンピュータ証明書(それぞれ発行)は個人ストアにインストール、ルート証明書(.cer形式)は信頼された証明機関ストアにインストールするコマンドをそれぞれ行うことです。

    ルート証明書については、CA単位で同一(つまりコンピュータごとのp12証明書を発行してもすべて共通)ですので、ひとまずWindowsにGUIでp12証明書を一度インストールし、そのあと[ローカルコンピューター]\[信頼されたルート証明機関]からエクスポートしたものを、全台に対して使ってみてください。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


    2017年2月4日 6:17