実践習得 IBM MQの基本
SSL/TLSの構成(1)
※本連載は最新のmqpgf/mqpcfに基づいて改定されることがあります。 常に最新バージョンをダウンロードしてご使用ください。
IBM MQでは、そのサーバー間接続、クライアント接続での通信にSSL/TLSを使用することができます。
これから数回に渡って、IBM MQで利用可能なTLS構成のセットアップと使用方法について解説します。
SSL/TLS自体についての解説は他に譲り、ここではあくまで構成方法についてのみ説明します。
SSL/TLSを利用する場合、デジタル証明書の署名の方法として大きく下記の3つがあり、IBM MQではそのいずれも利用可能です。
外部CA署名証明書で運用 | 実際の運用でもっとも多いのがこの方法です。 外部CA(パブリック認証局)に署名してもらったデジタル証明書を使用します。 |
自己署名証明書で運用 | 構成手順が簡単な為、ほとんどの場合にSSL/TLS通信をテスト/検証する場合にのみ使用されます。 |
プライベートCAで署名した証明書で運用 | プライベート認証局を構築して運用します。 組織内に一旦CAを構築してしまうと、外部CA(パブリック認証局)を利用するよりも運用が自由で簡単になります。 プライベートCAはイントラネットCAと呼ばれることもあります。 |
ここでは、Opensslを使用して簡易的にプライベートCAを構築して、SSL/TLS通信の検証を行う方法をご紹介することにします。
構築の手順はWindows、Linux、HPE NonStopの3種類のプラットフォームを例として示します。
プライベートCAはそれぞれのマシン/キューマネージャーで別々のものを使用することもできれば、共通のCAを使用することも可能です。
MQネットワークがイントラネット環境内でのみで運用される場合は、CAは複数ある必要性はあまりないと考えられますが、外部CAを利用する場合は、認証局(CA)が別々であることは通常あり得ます。
その為、意図的にそれぞれのマシン/キューマネージャーで別々のCAを使用した場合を想定してご説明します。
尚、ここからは基本的なMQ構成を自力でセットアップできることを前提にします。
基本的な部分のキューマネージャーの作成や構成、オペレーションについての手順は省略いたしますので、その部分に不安がある場合はこれより以前の連載を参考にしてください。
Opensslを使用したプライベートCAの作成
Opensslを使用したプライベートCAの構築手順は想像するよりも大変シンプルです。
一旦、その方法になれるとMQでのSSL/TLSの検証には手軽で大変便利であることが理解してもらえると思います。
※プライベートCAの作成手順は特に断りが無い限りWindows/Linux/HPE Nonstopで共通です。
CA構築前の準備
OpensslはMQ for HPE NonStopには付属しているのでそれを利用可能ですが、Windows、Linux版のMQには付属していません。 Windows版はコンパイル済みのものがダウンロード可能になっていますので、それを利用すると便利です。 Linuxの場合はあらかじめ使用可能になっている場合も多いですが、そうなっていない場合はセットアップを行ってください。 その手順についての説明はここでは省略いたしますので、必要に応じて他のサイト等を参照して実施してください。 MQ for HPE NonStopの場合、opensslコマンドは <MQ Install Directory>/opt/mqm/bin にインストールされています。
高エントロピーの為の考慮
Opensslは疑似乱数生成器=PRNG(Pseudo Random Number Generator)に入力するシード・データを必要とします。
これには十分なエントロピーをもつシード値が提供される必要があります。
これは、Opensslのコマンドラインツールを使用する場合にも必要とされます。
Windowsの場合は、画面に表示されている内容など、さまざまなソース(生成源)からPRNGに入力するシードを得ます。
Unix/Linuxの場合は、/dev/urandomや/dev/randomなどが使用(/dev/urandomが優先)されますので、利用可能になっていることを確認します。
HPE NonStopの場合は、OSS ファイル・システムのソケットでサービス(/etc/egd-pool)が使用されます。
これを利用する為のエントロピー・デーモンは、MQ5.3では amqjkdm0 が提供されていましたが、MQ8では提供は無い為、OS側から提供される prngd を使用します。
MQ5.3とMQ8が併存する環境では引き続き amqjkdm0 を利用可能です。
amqjkdm0 | IBM MQ 5.3 サーバーで提供 |
/usr/local/bin/prngd | HP Integrity NonStop サーバー オープン・ソース技術ライブラリーによって提供 |
MQ for HPE NonStopではSSL/TLSを利用したMQ通信でもOpensslのライブラリを使用する為、キューマネージャーの実行中もこれらのデーモンの起動が必要になります。
参考までにprngdの手動での起動/停止の方法について紹介しておきます。 詳しくはOSの資料をご参照ください。
エントロピー・デーモンを起動/停止はSUPER.SUPERにて実施します。
手動で開始する例 |
OSS> run -term=/G/ZHOME /usr/coreutils/sbin/prngd /etc/egd-pool -m 0777 ※上記例では、全てのユーザーにエントロピー・デーモンの使用を許可しています。(-m 0777) |
手動で停止する例 | OSS> run -term=/G/ZHOME /usr/coreutils/sbin/prngd /etc/egd-pool -k |
コマンドラインツールを使用時に、十分なエントロピーを確保できない場合は'-rand'オプション、Opennssl構成ファイルのRANDFILEパラメータ、RANDFILE環境変数等が使用可能ですが、その利用方法のご説明は割愛いたします。 他の解説等をご参照お願いいたします。
CAが使用するファイル/ディレクトリの作成
プライベートCAが使用する各種ディレクトリを作成します。
<ca_root> | CAのルート・ディレクトリ。 任意の場所に任意の名前で作成します。 仮に、Windowsはwinca、Linuxはlnxca、NonStopはnscaとします。 |
<ca_root>/certs | 発行された証明書が保管される |
<ca_root>/crl | 発行された証明書失効リストが保管される |
<ca_root>/newcerts | 新しい証明書が配置されるデフォルトの場所 |
<ca_root>/private | CAの秘密鍵が保管される |
$ mkdir openssl $ cd openssl $ mkdir lnxca $ cd lnxca $ mkdir certs $ mkdir certs crl newcerts private $ ls -l total 32 drwxr-xr-x 1 mqm mqm 4096 Jun 24 09:59 certs drwxr-xr-x 1 mqm mqm 4096 Jun 24 09:59 crl drwxr-xr-x 1 mqm mqm 4096 Jun 24 09:59 newcerts drwxr-xr-x 1 mqm mqm 4096 Jun 24 09:59 private
※Windowsの場合など、以下の必要なディレクトリやファイルの作成はエクスプローラーや任意のテキスト・エディタを使用して構いません。
プライベートCAが使用する各種ファイルを作成します。
serial | serialファイルは証明書の発行に使われるシリアル番号が格納され、発行の度にインクリメントされます。 |
index.txt | index.txtファイルはCAから発行された証明書の履歴です。 |
$ echo 01 > serial $ cat serial 01 $ touch index.txt $ ls -l index.txt -rw-rw-r--. 1 mqm mqm 0 Jun 23 16:05 index.txt $
serialファイルは初期値として"01"を使用し、index.txtファイルは空ファイルで作成します。
Openssl構成ファイルの準備
Openssl構成ファイル(openssl.cnf)ファイルを配置し編集します。 Opensslのインストールにはサンプルのopenssl.cnfファイルが含まれていますので、編集用にコピーしてください。 場所は本来自由ですが、わかりやすく上記で作成したCAのルート・ディレクトリでも構いません。 サンプルのopenssl.cnfファイルはWindowsの場合、通常<openssl install dir>bin\cnf\openssl.cnfに配置されています。 Linuxの場合は /etc/pki/tls/openssl.cnf 等にありますが、存在しない場合はOS側の資料等でご確認ください。
CA構成の定義
ここで準備するCAセクションは、後程サーバー証明書に署名時(openssl caコマンド使用時)に使用されます。
CA構成の為のopenssl.cnfファイルに設定する項目で重要なものを下記に記載します。
※青字になっている部分がデフォルトの設定から変更した箇所です。
section | parameter | example value | description |
[ ca ] | default_ca | winca | CAセクションの名前です。 デフォルト(CA_default)のままでも、識別するのにわかりやすい名前にしても構いません。 ここを変更すると次のセクション名[ CA_default ]も併せて変更する必要があります。(例の場合[ winca ]) |
[ CA_default ] | dir | C:/.../openssl/winca | CAのルート・ディレクトリです。 相対パスも指定できますが、絶対パスで指定する方が便利です。 Windowsの場合、ディレクトリセパレーターは'\'ではなく'/'を使用します。 |
certs | $dir/certs | 発行された証明書が保管される場所です。 | |
crl_dir | $dir/crl | 発行された証明書失効リストが保管される 場所です。 | |
database | $dir/index.txt | データベース・インデックス・ファイル | |
new_certs_dir | $dir/newcerts | 新しい証明書が配置されるデフォルトの場所です。 | |
certificate | $dir/cacert.pem | CA証明書のファイル名です。 | |
serial | $dir/serial | 現在のシリアル番号 | |
crlnumber | $dir/crlnumber | 現在の証明書失効リストの番号 | |
crl | $dir/crl.pem | 現在の証明書失効リスト | |
private_key | $dir/private/cakey.pem | CAの秘密鍵 | |
RANDFILE | $dir/private/.rand | プライベート乱数ファイルです。 シードデータの一部(256バイト)を格納します。 低エントロピーシステムの場合に有用で、既存のエントロピーに追加されます。 | |
x509_extensions | usr_cert | 証明書に追加する拡張機能を設定するセクション名 | |
default_days | 365 | 証明書の有効期限のデフォルト値です。 必要に応じて変更してください。 | |
default_crl_days | 30 | 証明書失効リスト (CRL) の有効期限のデフォルト値です。 必要に応じて変更してください。 | |
default_md | sha256 | 値に"default"が設定されている場合、Opensslのデフォルトのメッセージ・ダイジェストが使用されます。 OpenSSL 1.1では、デフォルトのダイジェストがMD5からSHA256に変更されています。 ここではわかりやすく明示的に sha256 を設定しています。 | |
policy | policy_anything | サンプルのopenssl.cnfはDN(distinguished name)を取り扱う為のポリシーとして、[ policy_match ]セクションと[ policy_anything ]セクションが用意されています。 タイプCAの場合、CSRのcountryName、stateOrProvinceName。organizationNameの属性はCA証明書と一致している必要があります(policy_match)。 ここでは、テストでの確認を容易にするために policy_anything を指定しています。 | |
[ usr_cert ] | basicConstraints | CA:FALSE | このCAが発行する証明書を他のCAの証明書として使用できないようにCA構成要素をFalseに設定します。 |
Sample openssl.cnf: .... #################################################################### [ ca ] #default_ca = CA_default # The default ca section default_ca = winca # The default ca section #################################################################### #[ CA_default ] [ winca ] dir = C:/.../openssl/winca # Where everything is kept certs = $dir/certs # Where the issued certs are kept crl_dir = $dir/crl # Where the issued crl are kept database = $dir/index.txt # database index file. #unique_subject = no # Set to 'no' to allow creation of # several certs with same subject. new_certs_dir = $dir/newcerts # default place for new certs. certificate = $dir/cacert.pem # The CA certificate serial = $dir/serial # The current serial number crlnumber = $dir/crlnumber # the current crl number # must be commented out to leave a V1 CRL crl = $dir/crl.pem # The current CRL private_key = $dir/private/cakey.pem# The private key x509_extensions = usr_cert # The extensions to add to the cert # Comment out the following two lines for the "traditional" # (and highly broken) format. name_opt = ca_default # Subject Name options cert_opt = ca_default # Certificate field options # Extension copying option: use with caution. # copy_extensions = copy # Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs # so this is commented out by default to leave a V1 CRL. # crlnumber must also be commented out to leave a V1 CRL. # crl_extensions = crl_ext default_days = 365 # how long to certify for default_crl_days= 30 # how long before next CRL #default_md = default # use public key default MD default_md = sha256 # use public key default MD preserve = no # keep passed DN ordering # A few difference way of specifying how similar the request should look # For type CA, the listed attributes must be the same, and the optional # and supplied fields are just that :-) #policy = policy_match policy = policy_anything # For the CA policy [ policy_match ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional # For the 'anything' policy # At this point in time, you must list all acceptable 'object' # types. [ policy_anything ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional .... [ usr_cert ] # These extensions are added when 'ca' signs a request. # This goes against PKIX guidelines but some CAs do it and some software # requires this to avoid interpreting an end user certificate as a CA. basicConstraints=CA:FALSE
ルート証明書を生成する為の情報を構成ファイルに設定
openssl.cnfファイルのreq セクションを定義します。
section | parameter | example value | description |
[ req ] | |||
default_bits | 2048 | 証明書用の秘密鍵を2048bitで生成する。 | |
default_keyfile | C:/.../openssl/winca/ private/cakey.pem |
生成する秘密鍵ファイル。 ここでは、caセクションで指定したファイル・パスと合わせています。 | |
default_md | sha256 | 発行される新しい証明書とCRLへの署名に使用するメッセージダイジェストにsha256を指定したので、矛盾しないようにここでも明示的に指定する。 | |
distinguished_name | req_distinguished _name |
証明書用の識別名が記述されたセクションの名前。 | |
x509_extensions | v3_ca | 証明書に含めたい拡張領域が記述されたセクションの名前。 | |
[ req_distinguished_name ] | |||
countryName_default | JP | 国名の略称(2文字) | |
stateOrProvinceName _default |
Chiba | 都道府県名 | |
0.organizationName _default |
Pulsar Integration Inc. | 組織名(会社名など) | |
commonName | www.pulsarintegration.com | サイトのURLのうち、サブドメインまでを含んだドメイン部分。 | |
emailAddress | support@pulsarintegration.com | E-mailアドレス。 | |
[ v3_ca ] | |||
basicConstraints | critical*,CA:true | 拡張領域のCAの構成要素をtrueに設定し、証明書とCRLに署名を行うCAとしてこの証明書を利用することが許可される。 criticalはプログラムが設定内容を厳守するように指示する。 | |
keyUsage | critical*,cRLSign, digitalSignature, keyCertSign |
keyUsage拡張領域:証明書の用途を定義するビット列を持つ。 criticalが指定されている場合、証明書の用途の妥当性を判断する再に、この拡張領域にある情報が必ず使用されます。 cRLSign: CAの証明書 digitalSignature: オブジェクトの署名 keyCertSign: 証明書の署名 |
*MQ8.1.0.15 for HPE NonStopよりOpensslのバージョンが1.1から3.0に変更されました。 そのことにより、basicConstraints拡張領域およびkeyUsage拡張領域共、"Critical"の設定が必須となっています(KeyUsage自体を省略することも禁止)。 対抗側の証明書チェーンのルートおよび中間CA証明書をチェックする為にOpensslのSSL_VERIFY_PEER()関数が呼び出された時、これらの"Critical"フラグが設定されていない場合、チャネルの開始が失敗します。
Sample openssl.cnf: .... #################################################################### [ req ] default_bits = 2048 #default_keyfile = privkey.pem default_keyfile = C:/.../openssl/winca/private/cakey.pem default_md = sha256 # default MD distinguished_name = req_distinguished_name attributes = req_attributes x509_extensions = v3_ca # The extensions to add to the self signed cert # Passwords for private keys if not present they will be prompted for # input_password = secret # output_password = secret # This sets a mask for permitted string types. There are several options. # default: PrintableString, T61String, BMPString. # pkix : PrintableString, BMPString (PKIX recommendation before 2004) # utf8only: only UTF8Strings (PKIX recommendation after 2004). # nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). # MASK:XXXX a literal mask value. # WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. string_mask = utf8only # req_extensions = v3_req # The extensions to add to a certificate request [ req_distinguished_name ] countryName = Country Name (2 letter code) #countryName_default = AU countryName_default = JP countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) #stateOrProvinceName_default = Some-State stateOrProvinceName_default = Chiba localityName = Locality Name (eg, city) 0.organizationName = Organization Name (eg, company) #0.organizationName_default = Internet Widgits Pty Ltd 0.organizationName_default = Pulsar Integration Inc. # we can do this but it is not needed normally :-) #1.organizationName = Second Organization Name (eg, company) #1.organizationName_default = World Wide Web Pty Ltd organizationalUnitName = Organizational Unit Name (eg, section) #organizationalUnitName_default = #commonName = Common Name (e.g. server FQDN or YOUR name) commonName = www.pulsarintegration.com commonName_max = 64 #emailAddress = Email Address emailAddress = support@pulsarintegration.com emailAddress_max = 64 # SET-ex3 = SET extension number 3 [ req_attributes ] challengePassword = A challenge password challengePassword_min = 4 challengePassword_max = 20 unstructuredName = An optional company name .... [ v3_ca ] .... basicConstraints = critical,CA:true
自己署名ルート証明書の作成
opensslコマンドへのPATHが設定されていない場合は設定します。
HPE NonStopの場合は、MQの環境設定ファイルを読み込めば同梱されているopensslへのパスが設定されます。
※Windowsの場合の例 >set PATH=%PATH%;C:\Program Files\OpenSSL-Win64\bin >openssl version OpenSSL 1.1.1k 25 Mar 2021 > ※Unix系OSの場合の例 export PATH=$PATH:/usr/local/ssl/bin $ openssl version OpenSSL 1.1.1j 16 Feb 2021 $ ※HPE NonStopの場合 $ . <MQ install directory>/var/mqm/wmqprofile(MQ5.3.1の場合) $ . <MQ install directory>/var/mqm/mqprofile (MQ8の場合)
OPENSSL_CONF環境変数を設定します。
※Windowsの場合の例 >set OPENSSL_CONF=C:\...\openssl\winca\openssl.cnf ※Unix系OSの場合の例 $ export OPENSSL_CONF=/.../.../openssl.cnf ※指定しない場合、opensslコマンド実行の度に下記警告が出力される場合があります。 WARNING: can't open config file: /usr/local/ssl/openssl.cnf
自己署名ルート証明書を作成するコマンドは下記です。
openssl req -x509 -newkey rsa -out cacert.pem -outform PEM -days 3650
*オプションの説明
req: このコマンドを使用して、証明書要求の作成、確認、操作、およびルートCAの開設で使用するのに適した自己署名証明書(ルート証明書)を作成することができます。
-x509: 証明書要求ではなく、(ルートCAでの使用に適した)自己署名証明書を出力します。
-newkey rsa: 新しい鍵ペアを作成し、その公開鍵暗号化方式にRSAを使用します。
RSAの場合素数の長さも指定できます。
指定を省略した場合、構成ファイルの [ req ] セクションに設定した default_bits の値が使用されます。
-out <filename>: 自己署名証明書または証明書要求の出力先のファイル名です。
省略すると標準出力が使用されます。
-outform: 自己署名証明書または証明書要求の形式(DERまたはPEM)を指定。デフォルトは PEM です。
-days <number>: 生成する自己署名証明書の有効期限の日数。
CAディレクトリに移動後、上記コマンドを実行します。 その際、パス・フレーズを聞かれます。 これは後程必要になりますので、記録しておいてください。 証明書用の識別名の各パラメータを確認するプロンプトが出ますが、構成ファイルに指定したdefault値のままで良い場合はリターンのみ入力します。 commonName、emailAddressについてdefault値を指定していないので入力します。
> cd ..../winca > openssl req -x509 -newkey rsa -out cacert.pem -outform PEM -days 3650 Generating a RSA private key ..............................................................................+++++ .................................................+++++ writing new private key to '..../winca/private/cakey.pem' Enter PEM pass phrase: winca Verifying - Enter PEM pass phrase: winca ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [JP]: State or Province Name (full name) [Chiba]: Locality Name (eg, city) []: Organization Name (eg, company) [Pulsar Integration Inc.]: Organizational Unit Name (eg, section) []: www.pulsarintegration.com []:www.pulsarintegration.com support@pulsarintegration.com []:support@pulsarintegration.com >
作成された自己署名ルート証明書を下記コマンドでテキストダンプして確認します。
openssl x509 -in cacert.pem -text -noout
*オプションの説明
x509: X.509証明書の作成、確認、その他さまざまな操作を行います。
-in <filename>: 読み込むファイル名(この場合はX.509 自己署名ルート証明書)。
-text: 読み込んだ証明書を可読性のある形式に変換して出力します。
-noout: 証明書の符号化された形式での出力を抑制します。
青字の部分(Signature Algorithm、Issuer、Validity、Subject、Public Key Algorithm、X509v3 Basic Constraints、Signature Algorithm)が指定(想定)通りになっているかを確認します。
>openssl x509 -in cacert.pem -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
78:8c:a6:a9:32:69:37:d5:aa:d6:74:40:a1:29:b4:2f:ce:2d:99:36
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = JP, ST = Chiba, O = Pulsar Integration Inc., CN =
www.pulsarintegration.com, emailAddress = support@pulsarintegration.com
Validity
Not Before: Jul 16 04:14:26 2021 GMT
Not After : Jul 14 04:14:26 2031 GMT
Subject: C = JP, ST = Chiba, O = Pulsar Integration Inc., CN =
www.pulsarintegration.com, emailAddress = support@pulsarintegration.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:9b:4d:5e:b7:54:6b:8f:a1:d3:95:52:d3:69:2e:
f7:30:23:46:67:21:9e:30:32:6a:cd:a8:cf:75:52:
89:73:53:1b:f1:e1:00:95:d8:a7:05:df:2d:fd:7b:
19:fe:b7:40:0e:98:ed:6a:af:e5:de:f5:23:78:88:
29:9d:0b:4d:e0:74:8c:0e:9f:88:4d:bd:15:db:43:
56:a9:e0:0d:a2:96:fe:15:66:f4:f3:66:54:84:c4:
bb:86:02:c0:0a:69:34:24:d6:f0:a8:1d:db:14:7c:
7a:62:e9:d3:70:0e:42:c3:af:45:6c:cc:17:e8:9e:
ef:5e:ed:e4:d1:a8:04:ef:46:66:b7:5d:ed:09:91:
ba:e1:19:98:44:d6:2e:29:4a:2a:92:87:38:f3:e4:
87:37:74:b1:29:03:ee:62:ab:fc:c9:63:c3:a8:7f:
ce:aa:13:95:bf:1d:2d:46:73:73:4a:a1:68:26:f5:
7c:04:b0:be:6c:0c:bb:63:b5:45:e9:b6:33:d8:e8:
77:21:5c:11:ea:74:41:0c:d7:a5:51:17:0f:d8:93:
26:51:32:24:76:4e:ed:89:88:6d:52:2f:72:b8:35:
69:fc:85:bb:04:ca:8a:a3:0c:69:bc:75:52:8e:79:
66:65:33:43:c9:3c:82:f4:70:ba:fc:99:bf:32:04:
32:1b
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
23:0B:5D:88:01:02:F5:6E:2B:F7:67:3D:67:A3:EF:AB:72:8D:43:A2
X509v3 Authority Key Identifier:
keyid:23:0B:5D:88:01:02:F5:6E:2B:F7:67:3D:67:A3:EF:AB:72:8D:43:A2
X509v3 Basic Constraints: critical
CA:TRUE
Signature Algorithm: sha256WithRSAEncryption
38:80:07:0e:eb:0b:31:fb:f8:22:7d:f0:fa:50:33:00:f8:63:
e3:84:83:a9:8f:60:d4:72:d0:98:d8:04:b9:28:82:71:ff:4d:
ce:03:86:d8:e2:ab:21:7e:56:8f:98:ec:1c:41:9f:ae:67:1e:
83:ca:52:24:60:3a:59:e4:80:e4:f8:4d:da:64:96:05:45:0e:
e2:ef:82:50:b8:53:5e:b3:bd:fa:74:b8:1a:85:e1:fc:29:2d:
d7:bc:be:3a:b8:81:a5:ef:bf:1f:ad:49:74:0e:ec:ba:7a:53:
5e:12:3a:f1:39:0f:bd:bd:f8:ba:26:b0:00:85:3c:dc:d6:05:
83:00:53:f3:67:96:9f:cf:36:9a:74:ee:06:6f:eb:5b:af:28:
1f:da:73:96:34:4f:4b:86:61:00:09:9c:30:11:b1:69:aa:62:
77:5b:26:bf:7a:6c:fe:ca:9f:35:50:19:95:dc:79:00:c7:91:
19:e9:2d:6e:01:d7:91:c8:38:7c:07:9f:31:da:44:5b:1d:86:
e7:49:0f:89:73:d1:0b:dd:4e:9b:01:08:7f:b2:48:ff:f2:1b:
9e:19:be:7e:7e:4c:22:fa:78:d3:5a:9e:01:4c:76:13:90:94:
3f:4f:67:ba:4d:bb:7b:6c:a6:8c:ce:19:49:f8:74:85:04:2e:
7a:10:62:d8
>
CAのプライベート・キーも作成されていることを確認します。 PEM は、Base64 でエンコードされる証明書形式です。
>cd private >dir ... 2021/07/16 13:14 1,884 cakey.pem ... > type cakey.pem (Windowsの場合) > cat cakey.pem (Unix系OSの場合) -----BEGIN ENCRYPTED PRIVATE KEY----- MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQInBgXOOHH1XkCAggA MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECLR2QB+/LXw1BIIEyAlOn8D3P/Hh .... goFBi9hkAqG7xCmwPGqGziC8ZQnvBRRQ4FkcXiQUqgox+BkzWk4/tzaXua96D1Nx cNQ/COBPLF+AIVG5cNCUbg== -----END ENCRYPTED PRIVATE KEY----- >
各サーバーでのSSL/TLSのセットアップ(CSRの作成まで)(GSKit)
MQ for Multiplatforms はSSL/TLSのライブラリに GSKit(IBM Global Security Kit) を使用します。
MQ8 for HPE NonStopはMQ5.3.1と同様、引き続き Open SSL を使用します。
先にGSKitでの作業手順をご説明します。(MQ8 for HPE NonStop(Open SSL)での作業手順は後述します。)
これ以降の手順は、下記バージョンで検証しています。
Windows |
9.2.0.0 |
Linux | 9.1.0.4/9.2.0.4 |
SSL/TLSセットアップで使用するGSKitコマンド
GSKitでは、strmqikm(iKeyman)、runmqckm(iKeycmd)、runmqakm(GSKCapiCmd)コマンドが使用できます。
strmqikm(iKeyman) |
iKeyman GUIを使用して鍵およびデジタル証明書を管理します。 ※Unix, Linux, Windowsで使用可能です。 |
runmqckm(iKeycmd) | iKeycmd コマンド行インターフェースで鍵およびデジタル証明書の管理タスクを実行します。 |
runmqakm(GSKCapiCmd) |
runmqakm のコマンド構文は runmqckm の構文と同じです。
SSL 証明書を、FIPS に準拠した方法で管理する必要がある場合に、runmqakm コマンドを使用します。
FIPS準拠が必要な場合は使用できる CipherSpec が一部制限されます。 ※FIPS準拠が必要ない場合でも、鍵のサイズに2048以上を使用する場合はrunmqakm コマンドを使用します。 |
以降の手順では基本的に runmqckm コマンドを使用し、証明書要求の作成時にのみ runmqakm を使用します。
各キュー・マネージャーで鍵リポジトリーを準備(Windows, Linux)
各マシンのログイン環境にMQ環境がセットアップされていない場合、SSL/TLSを構成するキューマネージャーの環境をセットアップします。
※Windowsの場合
> cd
※setmqenvに-sを指定すると、複数のMQインストールの内、実行したsetmqenvと同一のインストールの環境が設定されます。
鍵リポジトリを作成します。 デフォルトのキーリポジトリの配置場所はキューマネージャーの SSLKEYR プロパティに設定されています。
> mqpcf mqsc -qm PL92W -s "dis qmgr SSLKEYR" 1: AMQ8408I: ... QMNAME(PL92W) SSLKEYR(C:\ProgramData\IBM\MQ\qmgrs\PL92W\ssl\key) ※Windowsの場合のデフォルト
*オプションの説明
mqsc: 任意のmqscコマンドを実行します。
-s : MQSCコマンド文字列
Linuxの場合のデフォルトはSSLKEYR(/var/mqm/qmgrs/PL91L/ssl/key)です。
末尾のkeyはディレクトリではなく、リポジトリのファイル名です。
リポジトリの配置場所へ移動します。
>※Windowsの場合 >cd C:\ProgramData\IBM\MQ\qmgrs\PL92W\ssl ※Linuxの場合 $ cd /var/mqm/qmgrs/PL91L/ssl
runmqckmコマンドを使用してキー・リポジトリを作成します。
※下記は Windows の例ですが Linux も同様です。
...\ssl>runmqckm -keydb -create -db key.kdb -pw PL92Wpass -type cms -stash 5724-H72 (C) Copyright IBM Corp. 1994, 2020.
*オプションの説明
-keydb: コマンドの対象は鍵データベース
-create: 鍵データベースを作成
-db filename: CMS 鍵データベースの完全修飾ファイル名を指定。
ファイル拡張子は .kdb である必要があります。
-pw password: CMS 鍵データベースのパスワードを指定します。
-type cms: 鍵データベースのタイプを指定します。
IBM MQ の場合は必ず cms(Certificate Management System) を指定します。
-stash: 鍵データベース・パスワードをファイルに保存する。
下記3つのファイルが作成されます。
>dir ... 2021/07/21 14:43 88 key.kdb 2021/07/21 14:43 80 key.rdb 2021/07/21 14:43 193 key.sth ...
これらのファイルについての概略の説明を記載しておきます。
key.kdb | 「キーデータベース」ファイル。 個人証明書、個人証明書要求、および署名者証明書を格納します。 |
key.sth | キーデータベースパスワードを難読化したものが格納されます。 このファイルには、秘密鍵がある場合はそれも格納されます。 |
key.rdb | 「リクエスト」データベースファイル。 .kdbキーデータベースファイルを作成すると、自動的に作成されます。 このファイルには、未処理でCAからまだ受信されていない証明書要求が含まれています。 CAから証明書が返されると、.rdbファイルで一致する証明書要求が検索されます(公開鍵に基づく)。 一致するものが見つかった場合、証明書が受信され、対応する証明書要求が.rdbファイルから削除されます。 一致するものが見つからない場合、証明書の受信の試みは拒否されます。 証明書要求には、要求時に指定された一般名、組織、住所、その他の情報、および要求に関連付けられた公開鍵と秘密鍵が含まれます。 |
CERTLABLについて
MQ8.0以降はチャネル毎にCERTLABLを指定して、チャネル毎に異なる個人証明書を選択できるようになっています。
インバウンド・チャネル (サーバー接続や受信側など) は、TLS Server Name Indication (SNI) を使用したチャネル名の検出に依存しており、相手側のキューマネージャーが証明書ラベル構成をサポートし、かつチャネルが TLS CipherSpec を使用している場合にのみCERTLABLに指定された証明書を送信します。
MQ8.0以前のリリースではキューマネージャーの CERTLABL パラメーターによって構成された証明書のみを受信しますので、MQ5.3 for HPNonStop等、古いキューマネージャーと接続する場合は制約があるので注意が必要です。
(この制約についての詳しいご説明はここでは省略いたします。)
キューマネージャーのデフォルトの CERTLABL は Windows/Linux では ibmwebspheremq にキュー・マネージャーの名前(小文字)で付加した形式で、HPE NonStopではブランクです。
>mqpcf mqsc -qm PL92W -s "dis qmgr CERTLABL" ※Windows/Linuxの場合の例 1: AMQ8408I: QMNAME(PL92W) CERTLABL(ibmwebspheremqpl92w)
以降、チャネル毎にCERTLABLを指定する場合を例に手順を示します。
証明書の署名リクエスト(CSR)を作成(Windows, Linux)
CSR(Certificate Signing Request)は、CAに対してのサーバ証明書への署名リクエストです。
CSRの作成時、鍵のサイズに2048を使用する場合は runmqckm ではなく runmqakm を使用します。
その際、-fipsは指定しません。
※下記は Windows の例ですが Linux も同様で、一行で指定します。
DNには各サーバー毎の内容を指定します。
...\ssl>runmqakm -certreq -create -db key.kdb -pw PL92Wpass -label PL92WA -dn "CN=www.pulsarintegration.PL92W.com,O=Pulsar Integration PL92W Inc.,S=Chiba,C=JP" -size 2048 -file key.csr -sig_alg sha256 5724-H72 (C) Copyright IBM Corp. 1994, 2020.
*オプションの説明
-certreq: コマンドの対象は証明書要求
-create: 証明書要求を作成
-db filename: CMS 鍵データベースの完全修飾ファイル名を指定します。
-pw password: CMS 鍵データベースのパスワードを指定します。
-label label: 証明書に付加する鍵ラベルを指定します。
ラベルは CERTLABL 属性が設定されている場合はその値、またはデフォルトの ibmwebspheremq にキュー・マネージャーの名前(小文字)で付加した形式。
-dn: distinguished_name: 二重引用符で囲んだ X.500 識別名を指定します。
少なくとも 1 つの属性が必要。
-size: キー・サイズの指定。
-file: 証明書要求のファイル名。
-sig_alg: 認証要求の作成中に使用されるハッシュ・アルゴリズム。
証明書要求ファイル"key.csr"が作成されます。
>dir ... 2021/07/21 16:00 1,038 key.csr 2021/07/21 14:43 88 key.kdb 2021/07/21 16:00 5,080 key.rdb 2021/07/21 14:43 193 key.sth
証明書要求が想定通りに作成されているか確認します。
...\ssl>runmqckm -certreq -details -label PL92WA -db key.kdb ... A password is required to access the source key database. Please enter a password: PL92Wpass Label:PL92WA Key Size:2048 Subject: CN=www.pulsarintegration.PL92W.com, O=Pulsar Integration PL92WA Inc., ST=Chiba, C=JP Fingerprint: 07:47:A3:DE:98:5E:DC:88:6E:35:AC:90:4E:B6:E7:70 Signature Algorithm: SHA256withRSA (1.2.840.113549.1.1.11)
*オプションの説明
-certreq: コマンドの対象は証明書要求
-detail: 特定の証明書要求の詳細を表示
-label label: 参照する証明書要求に付加した鍵ラベル
-db filename: CMS 鍵データベースの完全修飾ファイル名を指定します。
各サーバーでのSSL/TLSのセットアップ(CSRの作成まで)(Openssl)
HPE NonStopでは以下の作業も全てopensslを使用します。 以下では、.../openssl/nsca 下にキューマネージャー名のディレクトリを作成して作業しています。 作業管理の方法は決まったやり方はありませんので、システムの都合に合わせて自由に決めて作業してください。
$ cd ..../openssl/nsca $ mkdir PL81N $ cd PL81N
証明書の署名リクエスト(CSR)を作成(HPE NonStop)
証明書の署名リクエスト(CSR)作成用のopenssl.cnfを作業ディレクトリに作成します。
openssl.cnfファイルのreq セクションを定義します。
section | parameter | example value | description |
[ req ] | default_bits | 2048 | 証明書用の秘密鍵を2048bitで生成する。 |
default_md | sha256 | 使用するメッセージダイジェストにsha256を指定する。 | |
distinguished_name | req_distinguished _name |
証明書用の識別名が記述されたセクションの名前。 | |
x509_extensions | v3_req | 証明書に含めたい拡張領域が記述されたセクションの名前。 | |
[ req_disting uished_name ] |
countryName_default | AU | 国名の略称(2文字) |
stateOrProvinceName _default |
Sydney | 都市名 | |
0.organizationName _default |
Pulsar Integration PL81NA Inc. |
組織名(会社名など) | |
commonName | www.sd.pulsarintegration .PL81N.com |
サイトのURLのうち、サブドメインまでを含んだドメイン部分。 | |
[ v3_req ] | basicConstraints | CA:FALSE | CAの証明書として利用することを禁止。 |
Sample openssl.cnf: .... #################################################################### [ req ] default_bits = 2048 default_keyfile = privkey.pem default_md = sha256 distinguished_name = req_distinguished_name attributes = req_attributes #x509_extensions = v3_ca # The extensions to add to the self signed cert x509_extensions = v3_req # Passwords for private keys if not present they will be prompted for # input_password = secret # output_password = secret # This sets a mask for permitted string types. There are several options. # default: PrintableString, T61String, BMPString. # pkix : PrintableString, BMPString (PKIX recommendation before 2004) # utf8only: only UTF8Strings (PKIX recommendation after 2004). # nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). # MASK:XXXX a literal mask value. # WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. string_mask = utf8only # req_extensions = v3_req # The extensions to add to a certificate request [ req_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = AU countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) #stateOrProvinceName_default = Some-State stateOrProvinceName_default = Sydney localityName = Locality Name (eg, city) 0.organizationName = Organization Name (eg, company) #0.organizationName_default = Internet Widgits Pty Ltd 0.organizationName_default = Pulsar Integration PL81NA Inc. # we can do this but it is not needed normally :-) #1.organizationName = Second Organization Name (eg, company) #1.organizationName_default = World Wide Web Pty Ltd organizationalUnitName = Organizational Unit Name (eg, section) #organizationalUnitName_default = #commonName = Common Name (e.g. server FQDN or YOUR name) commonName = www.sd.pulsarintegration.PL81N.com commonName_max = 64 emailAddress = Email Address emailAddress_max = 64 # SET-ex3 = SET extension number 3 [ req_attributes ] challengePassword = A challenge password challengePassword_min = 4 challengePassword_max = 20 unstructuredName = An optional company name .... [ v3_req ] # Extensions to add to a certificate request basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment
作成した構成ファイルをOPENSSL_CONF環境変数に設定します。
$ export OPENSSL_CONF=..../openssl/nsca/PL81N/openssl.cnf
MQの環境設定ファイルを読み込みます。
$ . <MQ install directory>/var/mqm/wmqprofile(MQ5.3.1の場合)
$ . <MQ install directory>/var/mqm/mqprofile (MQ8の場合)
エントロピー・デーモンが起動していることを確認してください。
$ ps -ef|grep prngd | grep -v grep SUPER.SUPER 1744830575 .... 00:00 /usr/coreutils/sbin/prngd /etc/egd-pool -m 0777
エントロピー・デーモンが起動していない場合は開始してください。(上述) エントロピー・デーモンが起動してない場合、今回のテストでは RSA Private Key 生成時に、下記エラーが発生しました。
$ openssl req ... Generating a RSA private key Error Generating Key 0:error:2406C06E:random number generator:RAND_DRBG_instantiate:error retrieving entropy:... 0:error:2406C06E:random number generator:RAND_DRBG_instantiate:error retrieving entropy:... ...
証明書要求(CSR)を作成するコマンドは下記です。
openssl req -newkey rsa:2048 -sha256 -keyout PL81Nkey.pem -passout pass:PL81Npass -out PL81Nreq.pem
*オプションの説明
req: このコマンドを使用して、証明書要求の作成、確認、操作を行う。
-newkey rsa: 新しい鍵ペアを作成し、その公開鍵暗号化方式にRSAを使用します。
RSAの場合素数の長さも指定できます。
指定を省略した場合、構成ファイルの [ req ] セクションに設定した default_bits の値が使用されます。
-sha256: 証明書要求の署名に使うメッセージ・ダイジェスト・アルゴリズムに sha256 を指定します。
-keyout <filename>: 使用した秘密鍵の出力先となるファイル名を指定します。
-passout pass:&pass phrase>: 証明書または証明書要求とともに秘密鍵が生成される場合に、その秘密鍵の暗号化に使うパス・フレーズ。
-out <filename>: 出力する証明書要求の出力先のファイル名。
キューマネージャー名の作業ディレクトリに移動後、上記コマンドを実行します。 証明書用の識別名の各パラメータを確認するプロンプトが出ますが、構成ファイルに指定したdefault値のままで良い場合はリターンのみ入力します。 ここでは、commonNameのみ入力しています。
$ openssl req -newkey rsa:2048 -sha256 -keyout PL81Nkey.pem -passout pass:PL81Npass -out PL81Nreq.pem Generating a RSA private key .....................................+++++ ...........................................................+++++ writing new private key to 'PL81Nkey.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]: State or Province Name (full name) [Sydney]: Locality Name (eg, city) []: Organization Name (eg, company) [Pulsar Integration PL81NA Inc.]: Organizational Unit Name (eg, section) []: www.sd.pulsarintegration.PL81N.com []:www.sd.pulsarintegration.PL81N.com Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
PEM形式の秘密鍵ファイルと証明書要求のファイルが生成されます。
.../openssl/nsca/PL81N: ls -l total 28 -rw------- 1 MQM.MANAGER MQM 1854 Jul 21 20:22 PL81Nkey.pem -rw-r--r-- 1 MQM.MANAGER MQM 1021 Jul 21 20:22 PL81Nreq.pem -rw-rw-rw- 1 MQM.MANAGER MQM 11147 Jul 21 19:09 openssl.cnf
証明書要求が想定通りに作成されているか確認します。
.../openssl/nsca/PL81N: openssl req -in PL81Nreq.pem -text Certificate Request: Data: Version: 1 (0x0) Subject: C = AU, ST = Sydney, O = Pulsar Integration PL81NA Inc., CN = www.sd.pulsarintegration.PL81N.com Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (2048 bit) Modulus: ... Exponent: 65537 (0x10001) Attributes: a0:00 Signature Algorithm: sha256WithRSAEncryption ... -----BEGIN CERTIFICATE REQUEST----- ... -----END CERTIFICATE REQUEST-----
*オプションの説明
req: このコマンドを使用して、証明書要求の作成、確認、操作を行う。
-in: 証明書要求のファイル名を指定します。
-text: 読み込んだ証明書要求を可読性のある形式に変換して出力します。