2017年2月25日

Certum Opensource Code Signing

2017年2月からコード署名の運用が少し厳しくなったようで、FIPS 140-2の暗号化モジュールが必須になるなどの変更がありました。

Leading Certificate Authorities and Microsoft Introduce New Standards to Protect Consumers Online - CA Security Council
https://casecurity.org/2016/12/08/leading-certificate-authorities-and-microsoft-introduce-new-standards-to-protect-consumers-online/

Certum が販売しているオープンソースプロジェクト向けコードサイニング証明書でも暗号化モジュールが必須になったので、購入に際して嵌った点などをまとめてみました。

Opensource Code Signing - Certum
https://www.certum.eu/certum/cert,offer_en_open_source_cs.xml


おおまかな手続きの流れ

  1. Certumのアカウントが無い場合はアカウントを作成します。
  2. PKI対応スマートカードを持っている場合は Activation Code、持っていない場合は Code Signing Suite を購入します。Code Signing Suite を購入した場合はSIMサイズのスマートカードと2GBのMicroSDカードを内蔵したUSBトークンがポーランドからDHLなどで郵送されます。(以降、Code Signing Suiteを購入したという前提で記述します。)
  3. USBトークンをPCに差し、後述の USBトークンのドライバと proCertum CardManager をインストールした状態で証明書を申請します。この時点では秘密鍵のみがスマートカードに保存されるようです。
  4. 証明書の承認に必要な書類のコピーとオープンソースプロジェクトのURLをメールで送ります。
  5. 承認されると公開鍵が発行されるので、proCertum CardManager からインポートします。

証明書の申請手続きの詳細は、次のリンクのPDFファイルを参照してください。

How to install the CS certificate - Certum
https://www.certum.eu/certum/cert,expertise_How_to_install_the_CS.xml


USBトークン

Code Signing Suite を購入すると送られてくるUSBトークンは Advanced Card Systems の ACR101 でした。内蔵のMicroSDカードにもドライバが入っていますが、ACSのサイトのほうが若干新しいバージョンとなっているようです。

Card reader ACS ACR 101 SIMicro (CCID) - Certum
https://www.certum.eu/certum/cert,offer_Czytnik_kart_ACS_ACR_101_SIMicro_(CCID)_en.xml

PC-Linked Readers with Mass Storage - ACR101 SIMicro | ACS
http://www.acs.com.hk/en/products/141/acr101i-simicro-ccid/

実機のスマートカードを使わずにTPMによる仮想スマートカードやHyper-Vの仮想TPMによる仮想スマートカードを使う手もあるようですが、ハードウェア要件が厳しいので実機があったほうが手軽かと思います。


proCertum CardManager

スマートカードに保存された証明書を管理するソフトです。内蔵のMicroSDカードにも入っていました。

Software and Libraries - Certum
https://www.certum.eu/certum/cert,offer_software_and_libraries.xml

proCertum CardManager - Certum
https://www.certum.eu/certum/cert,offer_card_manager.xml
(英語版マニュアルのリンクが間違っているようです。正しくは https://www.certum.eu/upload_module/wysiwyg/certum/nowe_certum/instructions/proCertumCardManager-en_3_2_0_146.pdf です。)

proCertum CardManager – FAQ - Certum
http://certum.eu/certum/cert,offer_proCertum_CardManager_support.xml

オプションで「EV Code Signing」をチェックしてからOSを再起動すると signtool のダイジェストアルゴリズムとしてSHA-256が使用可能になります。

オプションで「EV Code Signing」をチェックしたとき proCertum CardManager に含まれる cryptoCardRegister.exe が起動されるようですが、version 3.2.0.154 では起動に失敗してしまうようなので proCertum CardManager がインストールされたディレクトリに予めパスを通しておくと良いみたいです。

Code Signing Suite に付属するスマードカード限定かもしれませんが、proCertum CardManager から見ると「Secure profile」と「Common profile」の2つのプロファイルが用意されています。Secure profile には Certum が予め PUK を設定しているようなので使用できません。コードサイニング証明書は Common profile のほうにインポートします。

Common profile を初期化する際に PUK と PIN を設定しますが、PIN は signtool を実行する度に入力する必要があるので短か目にしておいたほうが良いかもしれません。当然ですが PUK と PIN を忘れるとそのスマートカードは使用不可になってしまいます。


証明書の承認に必要な書類など

以下の書類などが必要です。
  1. identity document (ID card, passport, residency card, driver's license) - in Latin characters - of the person placing the order. The copy should depict the entire document (both sides)
  2. a utility bill (e.g. water, electric power, natural gas, etc.), bank statement, credit card statement, government‐issued tax document belonging to the Subscriber
  3. internet address of the project

1番はパスポートか国際運転免許証が使用可能だと思います。私はパスポートを使用しました。

2番は公共料金の明細の類なのですが、Certumの担当者の方と何度か遣り取りしたところ大体以下のような要件となっているようです。
  1. ラテン文字 (キリル文字も多分OKかも?)
  2. 住所の記載がある
  3. 手書きではなく印刷されている (おそらく担当者のサインのみ手書きOKだと思われる)
  4. 13ヶ月以内に発行されている
いろいろ探した結果、住所の記載があるゆうちょ銀行の英文残高証明書が使用できました。
小さな郵便局では所定のフォーマットの紙に手書きするところもあるようなので、大きな郵便局が良いかもしれません。20~30分くらいで発行してもらえます。

3番はオープンソースプロジェクトのURLです。おそらくソースが公開されていてOSIに認定されているライセンスであればOKだと思います。


signtool

SignTool.exe - MSDN
https://msdn.microsoft.com/en-us/library/8s9b9yaz(v=vs.110).aspx

PFXファイルが使えなくなったので /a, /i, /n, /sha1 などのオプションでPCにインポートされた証明書を指定します。



以上です。

2016年12月4日

主な実装における EUC-JIS-2004, Shift_JIS-2004 から Unicode への変換結果の違い

まとめました。


nkfとiconvの差異
https://nathancorvussolis.blogspot.jp/2015/05/difference-between-nkf-and-iconv.html

Pythonとiconvの差異
https://nathancorvussolis.blogspot.jp/2016/11/difference-between-python-and-iconv.html

JavaのShift_JIS-2004については下記のブログを引用させていただきました。
iconv、Java、PythonのJISX0213 - yuan-jiu blog
http://yuan-jiu.asablo.jp/blog/2013/05/11/6807043


バージョン

libiconv 1.14
nkf 2.1.4
Python 3.4.5
Java 1.7.0_21


EUC-JIS-2004


EUC-JIS-2004iconvnkfPython
0xA1B1 U+FFE3 U+203E U+FFE3
0xA1EF U+FFE5 ¥U+00A5U+FFE5
0xA1BD U+2014 U+2014 U+2015
0xA2D6 U+FF5F U+FF5FU+2985
0xA2D7 U+FF60 U+FF60 U+2986

http://x0213.org/codetable/euc-jis-2004-std.txt より抜粋
0xA1B1  U+203E  # OVERLINE  Windows: U+FFE3
0xA1BD  U+2014  # EM DASH  Windows: U+2015
0xA1EF  U+00A5  # YEN SIGN  Windows: U+FFE5
0xA2D6  U+FF5F  # FULLWIDTH LEFT WHITE PARENTHESIS  [2000]  [Unicode3.2]
0xA2D7  U+FF60  # FULLWIDTH RIGHT WHITE PARENTHESIS  [2000]  [Unicode3.2]

EUC-JIS-2004 については FULLWIDTH かどうかの違いくらいしかないので、それほど問題はなさそうです。
Python の 0xA2D6 → U+2985 と 0xA2D7 → U+2986 はちょっとどうなの?と思ってしまいますが。


Shift_JIS-2004


Shift_JIS-2004iconvnkfPythonJava
0x5C ¥U+00A5 \U+005C ¥U+00A5 \U+005C
0x7E U+203E ~U+007E U+203E ~U+007E
0x8150 U+FFE3 U+203E U+FFE3 U+FFE3
0x815C U+2014 U+2014 U+2015 U+2014
0x815F U+FF3C U+FF3C \U+005C U+FF3C
0x818F U+FFE5 ¥U+00A5 U+FFE5 U+FFE5
0x81B0 U+FF5E U+FF5E ~U+007E U+FF5E
0x81D4 U+FF5F U+FF5F U+2985 U+FF5F
0x81D5 U+FF60 U+FF60 U+2986 U+FF60

http://x0213.org/codetable/sjis-0213-2004-std.txt より抜粋
0x5C    U+00A5  # YEN SIGN
0x7E    U+203E  # OVERLINE
0x8150  U+FFE3  # FULLWIDTH MACRON
0x815C  U+2014  # EM DASH  Windows: U+2015
0x815F  U+005C  # REVERSE SOLIDUS  Fullwidth: U+FF3C
0x818F  U+FFE5  # FULLWIDTH YEN SIGN
0x81B0  U+007E  # TILDE  [2000]  Fullwidth: U+FF5E
0x81D4  U+FF5F  # FULLWIDTH LEFT WHITE PARENTHESIS  [2000]  [Unicode3.2]
0x81D5  U+FF60  # FULLWIDTH RIGHT WHITE PARENTHESIS  [2000]  [Unicode3.2]

こうして見てみると、Python の 0x815F → U+005C がはまりポイントになりそうですね。

2016年11月30日

Pythonとiconvの差異

PythonとiconvとでJIS系文字コードとUnicodeとの変換にどれくらい違いがあるのか調べてみました。

EUC-JIS-2004とShift_JIS-2004のファイルをそれぞれUTF-8に変換して、その結果を比較します。

Python
https://www.python.org/
 
libiconv
http://www.gnu.org/software/libiconv/

変換元となるファイルについては、プロジェクトX0213の「JIS X 0213とUnicodeの対応表」から、文字付き版のファイルを使用しました。

JIS X 0213とUnicodeの対応表
http://x0213.org/codetable/

EUC-JIS-2004とUnicodeの対応表 文字付き版
http://x0213.org/codetable/euc-jis-2004-with-char.txt
Shift_JIS-2004とUnicodeの対応表  文字付き版
http://x0213.org/codetable/sjis-0213-2004-with-char.txt

今回使用した環境、バージョンは以下の通りです。

  • cygwin 2.6.0 (0.304/5/3)
  • Python 3.4.5
  • libiconv 1.14

追記: Pythonでの変換に使用した pconv.py は以下のようなコードです。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#

import codecs
import sys

if __name__ == "__main__":
    if (len(sys.argv) != 5):
        print('usage: python pconv.py <enc_from> <inputfile> <enc_to> <outputfile>')
        sys.exit(1)

    for arg in sys.argv:
        print(arg)

    output = codecs.open(sys.argv[4], 'w', sys.argv[3])

    for line in codecs.open(sys.argv[2], 'r', sys.argv[1]):
        try:
            output.write(line)
        except UnicodeEncodeError:
            print('UnicodeEncodeError')
            break

    output.close()

EUC-JIS-2004

$ python3 pconv.py euc_jis_2004 euc-jis-2004-with-char.txt utf_8 euc-jis-2004-python.txt
$ iconv -f EUC-JIS-2004 -t UTF-8 euc-jis-2004-with-char.txt > euc-jis-2004-iconv.txt
$ diff euc-jis-2004-python.txt euc-jis-2004-iconv.txt > diff-euc-jis-2004.txt
追記: diff-euc-jis-2004.txt
216c216
< ―    0xA1BD    U+2014    # EM DASH    Windows: U+2015
---
> —    0xA1BD    U+2014    # EM DASH    Windows: U+2015
335,336c335,336
< ⦅    0xA2D6    U+FF5F    # FULLWIDTH LEFT WHITE PARENTHESIS    [2000]    [Unicode3.2]
< ⦆    0xA2D7    U+FF60    # FULLWIDTH RIGHT WHITE PARENTHESIS    [2000]    [Unicode3.2]
---
> ⦅    0xA2D6    U+FF5F    # FULLWIDTH LEFT WHITE PARENTHESIS    [2000]    [Unicode3.2]
> ⦆    0xA2D7    U+FF60    # FULLWIDTH RIGHT WHITE PARENTHESIS    [2000]    [Unicode3.2]

EUC-JIS-2004の変換では、3つの文字で異なる変換結果が得られました。

  • 0xA1BD EM DASH
    • Python U+2015
    • iconv U+2014
  • 0xA2D6 FULLWIDTH LEFT WHITE PARENTHESIS
    • Python U+2985
    • iconv U+FF5F
  • 0xA2D7 FULLWIDTH RIGHT WHITE PARENTHESIS
    • Python U+2986
    • iconv U+FF60

Shift_JIS-2004

$ python3 pconv.py shift_jis_2004 sjis-0213-2004-with-char.txt utf_8 sjis-0213-2004-python.txt
$ iconv -f Shift_JIS-2004 -t UTF-8  sjis-0213-2004-with-char.txt > sjis-0213-2004-iconv.txt
$ diff sjis-0213-2004-python.txt sjis-0213-2004-iconv.txt > diff-sjis-0213-2004.txt
追記: diff-sjis-0213-2004.txt
310c310
< ―    0x815C    U+2014    # EM DASH    Windows: U+2015
---
> —    0x815C    U+2014    # EM DASH    Windows: U+2015
313c313
< \    0x815F    U+005C    # REVERSE SOLIDUS    Fullwidth: U+FF3C
---
> \    0x815F    U+005C    # REVERSE SOLIDUS    Fullwidth: U+FF3C
393c393
< ~    0x81B0    U+007E    # TILDE    [2000]    Fullwidth: U+FF5E
---
> ~    0x81B0    U+007E    # TILDE    [2000]    Fullwidth: U+FF5E
429,430c429,430
< ⦅    0x81D4    U+FF5F    # FULLWIDTH LEFT WHITE PARENTHESIS    [2000]    [Unicode3.2]
< ⦆    0x81D5    U+FF60    # FULLWIDTH RIGHT WHITE PARENTHESIS    [2000]    [Unicode3.2]
---
> ⦅    0x81D4    U+FF5F    # FULLWIDTH LEFT WHITE PARENTHESIS    [2000]    [Unicode3.2]
> ⦆    0x81D5    U+FF60    # FULLWIDTH RIGHT WHITE PARENTHESIS    [2000]    [Unicode3.2]

Shift_JIS-2004の変換では、5つの文字で異なる変換結果が得られました。

  • 0x815C EM DASH
    • Python U+2015
    • iconv U+2014
  • 0x815F REVERSE SOLIDUS
    • Python U+005C
    • iconv U+FF3C
  • 0x81B0 TILDE
    • Python U+007E
    • iconv U+FF5E
  • 0x81D4 FULLWIDTH LEFT WHITE PARENTHESIS
    • Python U+2985
    • iconv U+FF5F
  • 0x81D5 FULLWIDTH RIGHT WHITE PARENTHESIS
    • Python U+2986
    • iconv U+FF60

まとめ


FULLWIDTH LEFT WHITE PARENTHESIS と FULLWIDTH RIGHT WHITE PARENTHESIS が FULLWIDTH でなくなってしまうのが、Pythonのいまいちな点でしょうか。

今回の使用・作成したファイルをGitHubに上げていますので、興味のある方はご覧ください。
https://github.com/nathancorvussolis/difference-between-python-and-iconv

さらに追記:
すでにShift_JIS-2004の変換をまとめている方がおられたのでリンクしておきます。
iconv、Java、PythonのJISX0213 - yuan-jiu blog
http://yuan-jiu.asablo.jp/blog/2013/05/11/6807043