iDRAC6のKVMが “Connection Failed” で繋がらないとき

管理しているDELL PowerEdge R710に載ってるBMC(iDRAC6)のKVM機能がJava8になってから完全に繋がらなくなったので対処してみた。

元ネタはここ
調べた感じだと,同様の現象で困っている人がちらほら居るっぽい。

繋がらなくなったのがKVM機能だけだったので,てっきりJava側だけの問題だと思っていたら,原因は,デフォルトでインストールされている証明書がSHA-1で署名されていて,最近のブラウザとJavaだとそもそもSHA-1証明書を受け付けてくれないかららしい。。

iDRAC6のマニュアルにも書いてあるけど,

  1. A user logs into the main web GUI then clicks the “Open Consoles” tab.
  2. The Web GUI sends a pre -authentication request to the i DRAC6 web server via the HTTPS channel (SSL encrypted).
  3. The iDRAC6 web server returns a set of secret data (including an encryption key) via the SSL channel. The console redirection authentication key (32 bytes long) is dynamically generated to prevent replay attack.
  4. The Console redirection client sends a login command with an authentication key to a console redirection server keyboard/mouse port for authentication via SSL channel.
  5. If authentication is successful, a console redirection session and two console redirection pipes (one for keyboard/mouse and one for video) ar e established. The keyboard/mouse pipe is always SSL encrypted. The video pipe encryption is optional. (Users can choose to encrypt or not to encrypt the video pipe before they start their console redirection session).

KVMでつなぐ時はこんな手順で認証するらしく,
おそらくJavaがSHA-1証明書を弾くようになったので,上記の4で失敗するっぽい。

対策


要するに,証明書をSHA1でなくSHA2証明書に切り替えてやれば良いらしい。

iDRACの[iDRAC Settings]->[Network/Security]->[SSL] と辿ってゆくと,
CSRを生成する機能があるので,このCSRに対してオレオレ署名した証明書をアップロードしてれば良いっぽい。

ちなみに,デフォルトのCSRは以下のような感じになっている。

流れ


  1. オレオレ認証局を建てる (面倒くさい場合以下を全部すっ飛ばして,無料の証明局を使う手もある。)
  2. iDRACで適当に埋めたCSR生成してダウンロード
  3. 2.で作ったCSRに1.の認証局(CA)として署名した証明書を発行
  4. 3.の証明書をiDRACからアップロード
  5. iDRACをリブート(これ大事)

オレオレ証明局を建てる


適当なLinuxマシンの上でオレオレ認証局(CA)を建てる。
(以降,Debian9上でやることを想定)

Debianの場合demoCAというダミーCAの設定が /etc/ssl/openssl.cnf でされているので,
以下のようにオレオレCAの秘密鍵を作る。

CAの秘密鍵を生成する



$ mkdir -p demoCA/private
$ mkdir demoCA/newcerts
$ openssl genrsa -aes256 -out ./demoCA/private/cakey.pem 2048
Generating RSA private key, 2048 bit long modulus
..............................................+++
...........................................+++
e is 65537 (0x010001)
Enter pass phrase for ./demoCA/private/cakey.pem:
Verifying - Enter pass phrase for ./demoCA/private/cakey.pem:

パスフレーズ2回聞かれるので,適当に設定しておく。
これで ./demoCA/private/cakey.pem にオレオレCAの秘密鍵ができる。

CAのオレオレ証明書の発行要求CSRを生成する



$ openssl req -new -key ./demoCA/private/cakey.pem -out ./demoCA/cacert.csr
Enter pass phrase for ./demoCA/private/cakey.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]:JP
State or Province Name (full name) [Some-State]:Kanagawa
Locality Name (eg, city) []:Fujisawa
Organization Name (eg, company) [Internet Widgits Pty Ltd]:nyacom.net
Organizational Unit Name (eg, section) []:Admin
Common Name (e.g. server FQDN or YOUR name) []:nyacom.net
Email Address []:webmaster@nyacom.net

オレオレCAの証明書なので内容は適当。。
これで ./demoCA/cacert.csr にCSRができるので,
これにさっき作ったCA秘密鍵で自己署名して証明書を発行する。

オレオレCAの証明書を発行



$ openssl x509 -days 3650 -in ./demoCA/cacert.csr -req -signkey ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem
Signature ok
subject=C = JP, ST = Kanagawa, L = Fujisawa, O = nyacom.net, OU = Admin, CN = nyacom.net, emailAddress = webmaster@nyacom.net
Getting Private key
Enter pass phrase for ./demoCA/private/cakey.pem:

有効期限(days)は適当に10年(3650日)とかにしとく。

CAで署名に必要なファイルを作る



$ touch ./demoCA/index.txt
$ touch ./demoCA/index.txt.attr
$ echo 00 > ./demoCA/serial

上の3つのファイルがいるっぽい。

iDRAC上でCSRを生成


iDRACにログインし,[iDRAC Settings]->[Network/Security]->[SSL] と辿っていくと
“Generate Certificate Signing Request (CSR) ” という項目から生成できる。

適当にCSRの情報を埋めて[Generate]を押すことで,CSRがダウンロードできる。

オレオレCAでiDRACのCSAを署名して証明書を発行する



$ openssl ca -in nyacom6-bmc.csr -out idrac.crt -days 3650
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 0 (0x0)
Validity
Not Before: Oct 5 13:52:51 2017 GMT
Not After : Oct 3 13:52:51 2027 GMT
Subject:
countryName = JP
stateOrProvinceName = Kanagawa
organizationName = nyacom.net
organizationalUnitName = Admin
commonName = nyacom6-bmc.nyacom.net
emailAddress = webmaster@nyacom.net
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
F3:7A:C1:93:F6:8B:BE:06:B8:9D:1B:A5:91:11:47:30:03:35:7F:D9
X509v3 Authority Key Identifier:
DirName:/C=JP/ST=Kanagawa/L=Fujisawa/O=nyacom.net/OU=Admin/CN=nyacom.net/emailAddress=webmaster@nyacom.net
serial:A6:AE:3B:E7:1E:41:44:72

Certificate is to be certified until Oct 3 13:52:51 2027 GMT (3650 days)
Sign the certificate? [y/n]:yes

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

ポイントは自己署名ではなくて ca として署名することと,
有効期限を適当に伸ばしておかないと有効期限が短い証明書が発行されてしまう。

iDRACにオレオレCAで署名した証明書をアップロード

iDRACにログインし,[iDRAC Settings]->[Network/Security]->[SSL] と辿っていくと
“Upload Server Certificate” という項目から先程生成した idrac.crt をアップロードする。
成功すると “Upload Complete” とでてBMCがリセットされる。

最後にiDRACをリブート


証明書更新でiDRACがリセットされたら,iDRACに再ログインして [Reset iDRAC] からBMCを再リブートする。
こうしないとKVMセッションの証明書が更新されない(?)っぽい。

とりあえず証明書を更新後は
openjdk-8のicedteaでも問題なくKVMセッションに繋がるようになったので良かった。。

FAQ


とりあえずぶち当たったトラブルシュートだけメモしておく。

ca署名時にfailed to update database, TXT_DB error number 2 とか出る

  • 一度署名した証明書を再度署名しようとしているのが原因
  • 前の証明書を一度無効(revoke)にするか,./demoCA/index.txt 消して再度生成するかすれば署名できる

iDRACが作った証明書を受け付けてくれないんだけど?

  • おそらくiDRACで発行したCSRと署名した証明書があってない
  • iDRACで証明書を再度発行して,署名後に再アップロード

Leave a Reply

Your email address will not be published. Required fields are marked *