たれながし.info

とあるITエンジニアの備忘録

PowerShellでオレオレ証明書を作成する


目的

PowerShellの「New-SelfSignedCertificate」で、「オレオレ証明書自己署名証明書)」を作成できます。

learn.microsoft.com

オレオレ証明書の作成

作成する証明書のタイプは「-Type」で指定します。下記5つから選択が可能です。

  1. SSLServerAuthentication
  2. CodeSigningCert
  3. DocumentEncryptionCert
  4. DocumentEncryptionCertLegacyCsp
  5. Custom

今回は「TLSサーバー証明書の作成」「コードサイニング証明書」を作ってみます。

TLSサーバー証明書の作成

「-Type SSLServerAuthentication」でTLSサーバー証明書の作成が可能です。
「-Type」を未指定の場合もTLSサーバー証明書になります。

New-SelfSignedCertificate
    -DnsName "www.test.com", "www2.test.net"
    -CertStoreLocation "cert:\LocalMachine\My"

この例では、証明書の保存場所を「LocalMachine」としているので、管理者で実行する必要があります。
作成した証明書は「証明書の管理」から確認が可能です。


コードサイニング証明書の作成

「-Type CodeSigning」でコードサイニング証明書の作成が可能です。
この例では、パラメータを配列にしてコマンドレットの引数として渡してみます。

$params = @{
    Subject = 'CN=CodeSigningCert'
    Type = 'CodeSigning'
    CertStoreLocation = 'Cert:\CurrentUser\My'
    HashAlgorithm = 'sha256'
}
New-SelfSignedCertificate @params

作成した証明書は「証明書の管理」から確認が可能です。


秘密鍵と証明書のエクスポート

秘密鍵と証明書をPFX形式でエクスポートできます。
下記ではGUIで操作していますが、「certutil.exe」でも実施可能です。

証明書ストアで証明書を右クリック > すべてのタスク > エクスポート

秘密鍵を含んでエクスポートするので「はい、秘密キーをエクスポートします」を選択する

「証明書のパスにある証明書を可能であればすべて含む」は、自己署名証明書の場合はどちらでも良い
「すべての拡張プロパティをエクスポートする」はチェックする
「証明書のプライバシーを有効にする」をチェックすると、秘密鍵だけでなく証明書もパスフレーズで暗号化される

パスフレーズと出力パスを指定するとPFX形式で出力されます。
PFX形式からPEM形式への変換は「OpenSSL」や「Convert-PfxToPem.ps1」で実施可能です。

OpenSSLを利用した場合のコマンドは以下の通りです。

> openssl pkcs12 -in <PFX形式ファイル名> -nocerts -nodes -out <秘密鍵ファイル名>
> openssl pkcs12 -in <PFX形式ファイル名> -clcerts -nokeys -out <証明書ファイル名>

Visual C++でDLLを作ってみた

Visual C++でDLLを作って、rundll32.exeで実行してみました。

目的

「DLLを作ってみたい!」と思い検索したところ、Microsoftチュートリアルを公開していたので、それを参考にDLLを作ってみました。

作成したDLLを利用するアプリの作成は面倒なので、Windowsの標準コマンド「rundll32.exe」でDLL内の関数を実行することで動作確認してみます。

参考にしたページ

learn.microsoft.com

DLLの作成

Visual Studio 2022で作成しました。

プロジェクトの作成

新しいプロジェクトを作成します。名前は「TestDLL」にしました。
テンプレートは「ダイナミック リンク ライブラリ(DLL)」を選択。

ヘッダファイルの作成

[追加] > [新しい] > [ヘッダーファイル(.h)]からヘッダファイルを追加する。
ファイル名は「TestDLL.h」とし、以下内容を記載する。
※関数のエクスポート設定とエクスポートする関数のプロトタイプ宣言を記載

#pragma once

#ifdef TestDLL_EXPORTS
#define TestDLL_API __declspec(dllexport)
#else
#define TestDLL_API __declspec(dllimport)
#endif

extern "C" TestDLL_API void TestFunc();

関数の実装

「dllmain.cpp」に「DllMain関数」と「TestFunc関数」を定義します。
WindowsAPI「MessageBox」でメッセージボックスを表示する関数としました。

#include "pch.h"
#include "TestDLL.h"

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        MessageBox(NULL, TEXT("DllMain"), TEXT("DllMain"), MB_OK | MB_ICONINFORMATION);
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

void TestFunc()
{
    MessageBox(NULL, TEXT("TestFunc"), TEXT("TestFunc"), MB_OK | MB_ICONINFORMATION);
}

DLLのビルド

ビルドするとDLLができました。

動作確認

Windowsには、DLL内の関数を実行する「rundll32.exe」というコマンドがあります。
作成したDLL内の関数をrundll32.exeで実行してみます。

rundll32 TestDLL.dll,TestFunc

無事実行されメッセージボックスが表示されました。
 

DLLをプログラムから利用する方法の名前について

目的

Windowsには、DLLという仕組みがあります。DLLはDynamic Linking Libraryの略で、名前の通りプログラム実行時に動的にリンクされるライブラリです。ライブラリはプログラムの部品です。

Windowsプログラムの動作の仕組みや、プログラム解析の本を読んでいると、プログラムがDLLをどのように利用するかが書いてある章がだいたい存在します。
概ね2つの方法があって、1つ目はプログラムの起動時に、そのプログラムのヘッダに書いてあるインポートテーブルを参照してローダがDLLをメモリに読み込んでリンクする方法、もう1つの方法がWindows APIの「LoadLibrary」「GetProcAddress」を使ってプログラムの実行中に必要なタイミングでDLLをメモリに読み込みこんでリンクする方法です。

して、前者を「ロードタイムダイナミックリンキング(Load-Time Dynamic Linking)」、後者を「ランタイムダイナミックリンキング(Run-Time Dynamic Linking)」と呼ぶらしい。

DLLの利用方法については本やネットで説明されていることが多いが、DLLの利用方法の名前が書いてあることはほとんどないので、このブログ記事にメモっとこうと思います。

<参考>Microsoftのページ

ちなみに、Microsoftのサイトに該当のエントリがあります。日本語のページもあるけど翻訳がおかしいので、英語のページをGoogle翻訳した方が分かりやすいです。

learn.microsoft.com

learn.microsoft.com

SSL/TLS証明書でソフトウェアに署名できるか試してみる

はじめに

目的

証明書には、「SSL/TLS証明書」と「コードサイニング証明書」があります。
(厳密にはもっと沢山の種類の証明書があると思われる。)

SSL/TLS証明書」はHTTPSなどの通信に使用されます。「コードサイニング証明書」はソフトウェアなどのデジタル署名に使用されます。

ここで疑問に思ったのが、SSL/TLS証明書」でソフトウェアに署名できるのか?ということです。

証明書含めPKI公開鍵暗号基盤)は「X.509」という標準仕様で定義されているらしい。
ということで、「X.509」で「SSL/TLS証明書」と「コードサイニング証明書」の仕様や要件がちゃんと決まっているならば、「SSL/TLS証明書」でソフトウェアに署名は出来ない気がする。
しかし、デジタル署名というのは対象(この場合はソフトウェア)のハッシュ値秘密鍵で暗号化したものなので、そんな要件が厳しくなさそうで、「SSL/TLS証明書」でソフトウェアに署名することも出来なくはない気がする。

ということで、「SSL/TLS証明書」を取得してソフトウェアにデジタル署名出来るのか?試してみる。

ちなみに

逆である、「コードサイニング証明書」をSSL/TLS通信に使うことは、出来ないんだろうなーと思う。
理由としては、「SSL/TLS証明書」を取得する際は対象ホスト名を指定して取得するが、「コードサイニング証明書」には対象ホスト名が含まれていないので、SSL/TLS通信には使えないんだろうなーという理解です。
これも実際にやってみたら良いんだけど、公的な「コードサイニング証明書」を無料で取得できるか分からなかったので、実施しませんでした。

実際にやってみる

ドメインSSL/TLS証明書の取得

ドメインは0円で購入しました、「SSL/TLS証明書」は「Let's Encrypt」で取得しました。
以下は「Let's Encrypt」で取得したファイルの一覧です。

# ls -l /etc/letsencrypt/live/www.ssltlstest2.xyz
total 4
lrwxrwxrwx. 1 root root  43 Feb 17 11:00 cert.pem -> ../../archive/www.ssltlstest2.xyz/cert1.pem
lrwxrwxrwx. 1 root root  44 Feb 17 11:00 chain.pem -> ../../archive/www.ssltlstest2.xyz/chain1.pem
lrwxrwxrwx. 1 root root  48 Feb 17 11:00 fullchain.pem -> ../../archive/www.ssltlstest2.xyz/fullchain1.pem
lrwxrwxrwx. 1 root root  46 Feb 17 11:00 privkey.pem -> ../../archive/www.ssltlstest2.xyz/privkey1.pem


ソフトウェアへのデジタル署名

取得した証明書と秘密鍵を、OpenSSLで「PKCS#12(pfx)形式」に変換する

openssl pkcs12 -export -inkey privkey.pem -in cert.pem -out cert.pfx

Windows SDKに付属する「SignTool.exe」を使って
Windows標準の計算機(calc.exe)にデジタル署名の付与を試みました。

signtool.exe sign /f cert.pfx /fd SHA256 /debug calc.exe

結果と考察

結果

「条件を満たす証明書がない( No certificates were found that met all the given criteria.)」と表示され、署名を付与することはできませんでした。また、「After EKU filter, 0 certs were left.」とあるので、「拡張キー使用法(Extend Key Usage)」のチェックで、証明書が条件を満たしていないと判断されたみたいです。


考察

ざっと調べた感じだと、証明書には「キー使用法(Key Usage)」と「拡張キー使用法(Extended Key Usage)」という項目があるらしい。

左は今回取得した「SSL/TLS証明書」で、「キー使用法=Digital Signature, Key Encipherment (a0)」「拡張キー使用法=サーバー認証 (1.3.6.1.5.5.7.3.1)/クライアント認証 (1.3.6.1.5.5.7.3.2)」となっている。
右はChromeのデジタル署名に使われているGoogleの「コードサイニング証明書」で、「キー使用法=Digital Signature (80)」「拡張キー使用法=コード署名 (1.3.6.1.5.5.7.3.3)」となっている

 

ということで、「証明書は使用方法が限定されている(認証局が指定している)」と理解しました。

X.509の「キー使用法(Key Usage)」「拡張キー使用法(Extended Key Usage)」の記載は以下の通り。

Windowsのイベントログをコマンドでファイル出力する

イベントログのファイル出力

コマンド「wevtutil」のパラメータ「epl」で、Windowsのイベントログをコマンドでファイル出力できます。
例えば、以下コマンドを実行した場合、デスクトップにSystemログ、Applicationログがevtx形式で出力されます。

wevtutil epl System %USERPROFILE%\Desktop\system.evtx
wevtutil epl Application %USERPROFILE%\Desktop\application.evtx


コマンド「wevtutil」は、イベントログの操作コマンドとなり、
ファイル出力以外にもログ一覧の確認やログの消去など色々できます。

コマンドの詳細はMicrosoftの公式ドキュメントに記載があります。
learn.microsoft.com

おまけ情報

イベントログの既定の保存場所

イベントログは既定では「%SystemRoot%\System32\winevt\Logs」にevtx形式で保存されています。

Windows Insider Programに参加してみた

直近リリース予定の「Windows11 22H2」を利用したかったので、Windows Insider Programに参加してRelease PreviewのISOをDLしてみました。

Windows Insider Programへ参加

Windows Insider Program」のページにアクセスして「登録する」を押下する

MSアカウントでサインインして、規約を確認する

規約同意後の画面でISO DL用のリンクをクリックする

ISOのDL

Windows Insider Preview Downloads」にアクセスする
Windows Insider Program」に参加したMSアカウントでサインインする

「Edition」と「言語」を選択する
※Windows11のRelease Previewの日本語版を選択しました。

ISOのDLボタンが表示されるのでDLする

Kali LInuxにxrdpをインストールしてRDPでリモート接続



はじめに

ISOからインストールしたKali LinuxにxrdpをインストールしてRDPで接続する手順です。

まぁ、Kali Linuxの公式サイトで手順が公開されているんですけども。
(KaliがWSL環境、Docker環境で動いている場合の手順も記載があります。)

www.kali.org

ちなみに、Kali LinuxのISOイメージは日本だと山形大学北陸先端科学技術大学院大学FTPサーバで公開されています。
山形大学http://ftp.yz.yamagata-u.ac.jp/pub/linux/kali-images
北陸先端科学技術大学院大学http://ftp.jaist.ac.jp/pub/Linux/kali-images

環境

Kali Linux 2022.2
※ISOからインストール

設定

インストールとxrdp起動

必用なパッケージをインストールして、xrpdを起動します。

sudo apt-get install -y kali-desktop-xfce xorg xrdp
sudo systemctl enable xrdp --now

接続

「mstsc.exe」で接続してログインします。


カラーマネジメントされたデバイスを作成するには認証が必要です。」の対応

上画像のように「カラーマネジメントされたデバイスを作成するには認証が必要です。」という認証画面が表示されることがよくあります。
(英語だと「Authentication Required to Create Managed Color Device」)

これはPolkitという機能が表示してるらしいです。
認証したりキャンセルしても、OS再起動すると繰り返し表示されたりします。
以下のように許可を設定すると表示されなくなるらしい。

cat <<EOF | sudo tee /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla
[Allow Colord all Users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ResultAny=no
ResultInactive=no
ResultActive=yes
EOF