Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

w3m がはてなに HTTPS でアクセスできない

(2/26 追記: 解決! id:satob:20060226:p2)
例えば、 Debian sarge で、 w3mはてなのログインページ (https://www.hatena.ne.jp/login) にアクセスしようとすると、次のメッセージが出力される。

unable to get local issuer certificate: accept? (y/n)

これは、 w3m の使用するサーバ証明書が指定されていない(指定されている場所にない)のが原因である。
対策としては、次の手順でサーバ証明書リストを作成し、 w3m から使えるようにすればよい。

$ grep 'ssl_ca_path' /etc/w3m/config
ssl_ca_path /etc/ssl/certs
    • grep でマッチする行がなければ、行を追加すればいい……と思う。
  • 作業用ディレクトリを作る。 Mozilla ソース中の mozilla/security/nss/lib/ckfw/builtins/certdata.txt を Mozilla LXR から持ってくる。
$ mkdir tmp
$ cd tmp/
~/tmp$ wget -O certdata.txt http://lxr.mozilla.org/seamonkey/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1
  • w3m のドキュメント README.SSL に含まれている、次の Ruby スクリプト certdata2pem.rb を実行する。 certdata.txt が w3m で使う用のファイルに分解される。
#!/usr/bin/ruby
# Copyright (c) 2001 Fumitoshi UKAI <ukai@debian.or.jp>
#     All rights reserved.
#     This is free software with ABSOLUTELY NO WARRANTY.
#
# You can redistribute it and/or modify it under the terms of 
# the Ruby's licence.
#
# certdata2pem.rb

while line = $stdin.gets
  next if line =~ /^#/
  next if line =~ /^\s*$/
  line.chomp!
  if line =~ /CKA_LABEL/
    label,type,val = line.split(' ',3)
    val.sub!(/^"/, "")
    val.sub!(/"$/, "")
    fname = val.gsub(/\//,"_").gsub(/\s+/, "_").gsub(/[()]/, "=") + ".pem"
    next
  end
  if line =~ /CKA_VALUE MULTILINE_OCTAL/
    data=''
    while line = $stdin.gets
      break if /^END/
      line.chomp!
      line.gsub(/\\([0-3][0-7][0-7])/) { data += $1.oct.chr }
    end
    open(fname, "w") do |fp|
      fp.puts "-----BEGIN CERTIFICATE-----"
      fp.puts [data].pack("m*")
      fp.puts "-----END CERTIFICATE-----"
    end
    puts "Created #{fname}"
  end
end
system("c_rehash", ".")
~/tmp$ ruby certdata2pem.rb < certdata.txt
  • 不要なファイルは削除した後、生成されたファイルを "grep 'ssl_ca_path' /etc/w3m/config" で得られたディレクトリ(ここでは /etc/ssl/certs)に移動する。
~/tmp$ rm certdata.txt certdata2pem.rb 
~/tmp$ sudo mv * /etc/ssl/certs/
  • ファイルの移動先のディレクトリに移動して、 c_rehash コマンドを実行する。
$ cd /etc/ssl/certs/
$ sudo c_rehash

これで、 w3mhttps://www.hatena.ne.jp/login に問題なくアクセスできるようになる。