アプリケーションパッケージ開発者ガイド

署名付きパッケージの作成

署名付きパッケージを作成するプロセスには、複数の手順が含まれ、新しい概念と用語を理解する必要があります。この節では、署名付きパッケージ、その用語、および証明書管理に関して説明します。この節では、署名付きパッケージの作成手順についても説明します。

署名付きパッケージ

署名付きパッケージは、次のことを証明するデジタル署名 (次に定義する、PEM で符号化された PKCS7 デジタル署名) の付いた通常のストリーム形式のパッケージです。

署名付きパッケージは、署名が付いている点以外は、署名なしパッケージと同一です。署名付きパッケージと署名なしパッケージは、バイナリレベルで互換性があります。したがって、署名付きパッケージは古いバージョンのパッケージツールで使用できます。ただし、その場合、署名は無視されます。

署名付きパッケージ技術には新しい用語と省略名がいくつかあり、それについて次の表で説明します。

用語 

定義 

ASN.1 

Abstract Syntax Notation 1 - 抽象オブジェクトを表現する方法。たとえば、ASN.1 では、公開鍵証明書、証明書を構成するすべてのオブジェクト、オブジェクトの収集順序などが定義されています。ただし、ASN.1 では、オブジェクトを保存用または転送用に直列化する方法は定義されていません。

X.509 

ITU-T Recommendation X.509 - 広く採用されている X.509 公開鍵証明書の構文を指定します。

DER 

Distinguished Encoding Rules - ASN.1 オブジェクトのバイナリ表現であり、コンピューティング環境で保存用または転送用に ASN.1 オブジェクトを直列化する方法を定義しています。 

PEM 

Privacy Enhanced Message - Base 64 エンコーディングおよびオプションのヘッダーを使用して、(DER または別のバイナリ形式の) ファイルを符号化する方法。PEM はもともと、MIME タイプの電子メールメッセージをエンコードするために使用されました。また、PEM は、証明書と非公開鍵をファイルシステム上または電子メールメッセージ内のファイルに符号化する際にも広く使用されています。

PKCS7 

Public Key Cryptography Standard #7 - デジタル署名やデジタル封筒などの暗号化データに対する汎用的な構文を定めた規格です。署名付きパッケージには、埋め込まれた PKCS7 署名が含まれます。この署名には少なくとも、パッケージの暗号化されたダイジェストと署名者の X.509 公開鍵証明書が含まれています。また、署名付きパッケージはチェーン証明書を含むこともできます。チェーン証明書は、署名者の証明書からローカルに保存された信頼できる証明書まで、信頼の連鎖を形成するときに使用できます。 

PKCS12 

Public Key Cryptography Standard #12 - この規格では、暗号化されたオブジェクトをディスクに保存するための構文が規定されています。パッケージのキーストアは、この形式で保持されます。 

パッケージキーストア 

パッケージツールを使用して照会できる証明書と鍵のリポジトリ。 

証明書管理

署名付きパッケージを作成するには、先にパッケージキーストアが存在している必要があります。このパッケージキーストアには、証明書がオブジェクトの形式で含まれます。パッケージキーストアには、2 種類のオブジェクトが存在します。

信頼できる証明書

信頼できる証明書には、別のエンティティーに属する単一の公開鍵証明書が含まれます。信頼できる証明書という呼び名は、証明書に含まれる公開鍵が、その証明書の「サブジェクト」(所有者) によって示された本人のものであることを、キーストアの所有者が信頼することに由来しています。この信頼を表明するために、証明書の発行者はその証明書に署名します。

信頼できる証明書は、署名を検証するとき、およびセキュリティー保護されたサーバーへの接続 (SSL) を開始するときに使用されます。

ユーザー鍵

ユーザー鍵は、暗号鍵に関する機密情報を保持します。この情報は、不正なアクセスを防ぐために、セキュリティーが施された形式で格納されます。ユーザー鍵は、ユーザーの非公開鍵と対応する公開鍵証明書から構成されます。

ユーザー鍵は、署名付きパッケージを作成するときに使用されます。

デフォルトでは、パッケージキーストアは /var/sadm/security ディレクトリに格納されます。個別のユーザーも、独自のキーストアをデフォルトで $HOME/.pkg/security ディレクトリに格納できます。

ディスク上でのパッケージキーストアには、2 種類の形式があります。 つまり、複数ファイル形式と単一ファイル形式です。複数ファイル形式は、オブジェクトを複数のファイルに格納します。オブジェクトの種類ごとに、異なるファイルに保存されます。これらのファイルはすべて、同じパスフレーズを使用して暗号化される必要があります。単一ファイルキーストアは、すべてのオブジェクトをファイルシステムの単一のファイルに格納します。

証明書とパッケージキーストアの管理に使用する主なユーティリティは、pkgadm コマンドです。次に、パッケージキーストアの管理に使用される一般的な作業について説明します。

パッケージキーストアへの信頼できる証明書の追加

信頼できる証明書をパッケージキーストアに追加するには、pkgadm コマンドを使用します。PEM または DER の形式の証明書を使用できます。次に例を示します。


$ pkgadm addcert -t /tmp/mytrustedcert.pem

この例では、mytrustedcert.pem という名前の PEM 形式の証明書を、パッケージキーストアに追加します。

パッケージキーストアへのユーザー証明書と非公開鍵の追加

pkgadm コマンドは、ユーザー証明書または非公開鍵は生成しません。ユーザー証明書と非公開鍵は、通常、Verisign などの認証局から入手します。または、自己署名付き証明書としてローカルで生成します。入手した鍵と証明書は、pkgadm コマンドを使用してパッケージキーストアにインポートできます。次に例を示します。


pkgadm addcert -n myname -e /tmp/myprivkey.pem /tmp/mypubcert.pem

この例では、次のオプションを使用しています。

-n myname

パッケージキーストアに含まれる対象のエンティティー (myname) を特定します。myname エンティティーは、オブジェクトが格納される別名になります。

-e /tmp/myprivkey.pem

非公開鍵を含むファイルを指定します。この場合、ファイルは myprivkey.pem であり、/tmp ディレクトリにあります。

/tmp/mypubcert.pem

mypubcert.pem という名前の PEM 形式の証明書ファイルを指定します。

パッケージキーストアの内容の確認

pkgadm コマンドは、パッケージキーストアの内容の表示にも使用します。次に例を示します。


$ pkgadm listcert

このコマンドは、パッケージキーストアに含まれる信頼できる証明書と非公開鍵を表示します。

パッケージキーストアからの信頼できる証明書と非公開鍵の削除

pkgadm コマンドを使用すると、信頼できる証明書と非公開鍵をパッケージキーストアから削除できます。

ユーザー証明書を削除するときは、証明書と鍵のペアの別名を指定する必要があります。次に例を示します。


$ pkgadm removecert -n myname

証明書の別名は証明書の共通名であり、pkgadm listcert コマンドを使用して識別できます。たとえば、次のコマンドは、Trusted CA Cert 1 という名前の信頼できる証明書を削除します。


$ pkgadm removecert -n "Trusted CA Cert 1"

注 –

信頼できる証明書とユーザー証明書を同じ別名で保存した場合は、-n オプションを指定するとどちらも削除されます。


署名付きパッケージの作成

署名付きパッケージ作成のプロセスは、3 つの基本手順から成ります。

  1. 署名なしディレクトリ形式パッケージの作成。

  2. 署名証明書、CA 証明書、および非公開鍵のパッケージキーストアへのインポート。

  3. 手順 2 の証明書による手順 1 のパッケージへの署名。


注 –

パッケージツールでは証明書は作成されません。これらの証明書は、Verisign や Thawte などの認証局から入手する必要があります。


次に、署名付きパッケージ作成の各手順について説明します。

Procedure署名なしディレクトリ形式パッケージを作成する方法

署名なしディレクトリ形式パッケージを作成する手順は、すでに説明した通常のパッケージの作成手順と同じです。次の手順では、この署名なしディレクトリ形式パッケージを作成するプロセスを説明します。詳細については、パッケージの構築に関する前の節を参照してください。

  1. pkginfo ファイルを作成します。

    pkginfo ファイルは、次の基本的な内容となるようにしてください。


    PKG=SUNWfoo
    BASEDIR=/
    NAME=My Test Package
    ARCH=sparc
    VERSION=1.0.0
    CATEGORY=application
  2. prototype ファイルを作成します。

    prototye ファイルは、次の基本的な内容となるようにしてください。


    $cat prototype
    i pkginfo
    d none usr 0755 root sys
    d none usr/bin 0755 root bin
    f none usr/bin/myapp=/tmp/myroot/usr/bin/myapp 0644 root bin
  3. オブジェクトソースディレクトリの内容を一覧表示します。

    次に例を示します。


    $ ls -lR /tmp/myroot
    

    出力は次のような内容です。


    /tmp/myroot:
    total 16
    drwxr-xr-x   3 abc      other        177 Jun  2 16:19 usr
    
    /tmp/myroot/usr:
    total 16
    drwxr-xr-x   2 abc      other        179 Jun  2 16:19 bin
    
    /tmp/myroot/usr/bin:
    total 16
    -rw-------   1 abc      other       1024 Jun  2 16:19 myapp
  4. 署名なしパッケージを作成します。


    pkgmk -d `pwd`
    

    出力は次のような内容です。


    ## Building pkgmap from package prototype file.
    ## Processing pkginfo file.
    WARNING: parameter <PSTAMP> set to "syrinx20030605115507"
    WARNING: parameter <CLASSES> set to "none"
    ## Attempting to volumize 3 entries in pkgmap.
    part  1 -- 84 blocks, 7 entries
    ## Packaging one part.
    /tmp/SUNWfoo/pkgmap
    /tmp/SUNWfoo/pkginfo
    /tmp/SUNWfoo/reloc/usr/bin/myapp
    ## Validating control scripts.
    ## Packaging complete.

    現在のディレクトリにパッケージが存在するようになります。

Procedure証明書をパッケージキーストアにインポートする方法

インポートする証明書と非公開鍵は、PEM または DER で符号化された X.509 である必要があります。さらに、署名する証明書を認証局証明書にリンクするいずれかの中間、つまり「チェーン」証明書も、パッケージに署名する前にパッケージキーストアにインポートする必要があります。


注 –

各認証局は、さまざまな形式で証明書を発行できます。PKCS12 ファイルから PEM 符号化された X.509 ファイル (パッケージキーストアへのインポートに適したもの) に証明書と非公開鍵を抽出するには、OpenSSL などのフリーウェアの変換ユーティリティを使用します。


非公開鍵が暗号化されている場合 (通常の場合) は、パスフレーズの入力を求められます。また、生成されるパッケージキーストアを保護するためのパスワードの指定を求められます。パスワードを指定しないこともできますが、その場合は、生成されるパッケージキーストアは暗号化されません。

次の手順では、証明書が適切な形式になったあと、pkgadm コマンドを使用して証明書をインポートする方法について説明します。

  1. PEM または DER で符号化された X.509 証明書ファイルに含まれるすべての認証局証明書をインポートします。

    たとえば、ca.pem に含まれるすべての認証局証明書をインポートするには、次のように入力します。


    $ pkgadm addcert -k ~/mykeystore -ty ca.pem
    

    出力は次のような内容です。


    Trusting certificate <VeriSign Class 1 CA Individual \
    Subscriber-Persona Not Validated>
    Trusting certificate </C=US/O=VeriSign, Inc./OU=Class 1 Public \
    Primary Certification Authority
    Type a Keystore protection Password.
    Press ENTER for no protection password (not recommended): 
    For Verification: Type a Keystore protection Password.
    Press ENTER for no protection password (not recommended): 
    Certificate(s) from <ca.pem> are now trusted

    署名に使用する鍵をパッケージキーストアにインポートするには、あとでパッケージに署名するときに使用する別名を指定する必要があります。この別名は、パッケージキーストアから鍵を削除する場合にも使用できます。

    たとえば、署名鍵を sign.pem ファイルからインポートするには、次のように入力します。


    $ pkgadm addcert -k ~/mykeystore -n mycert sign.pem
    

    出力は次のような内容です。


    Enter PEM passphrase:
    Enter Keystore Password: 
    Successfully added Certificate <sign.pem> with alias <mycert>
  2. パッケージキーストアに証明書があることを確認します。

    たとえば、前の手順で作成したキーストア内の証明書を表示するには、次のように入力します。


    $ pkgadm listcert -k ~/mykeystore
    

Procedureパッケージに署名する方法

証明書をパッケージキーストアにインポートしたら、パッケージに署名できます。パッケージに実際に署名するには、pkgtrans コマンドを使用します。

  1. pkgtrans コマンドを使用してパッケージに署名します。署名なしパッケージの場所と、パッケージに署名するための鍵の別名を指定します。

    たとえば、前の手順の例を使用すると、SUNWfoo.signed という名前の署名付きパッケージを作成するには、次のように入力します。


    $ pkgtrans -g -k ~/mykeystore -n mycert . ./SUNWfoo.signed SUNWfoo
    

    このコマンドの出力は、次のような内容です。


    Retrieving signing certificates from keystore </home/user/mykeystore>
    Enter keystore password:
    Generating digital signature for signer <Test User>
    Transferring <SUNWfoot> package instance

    署名付きパッケージは、SUNWfoo.signed ファイルにパッケージストリーム形式で作成されます。この署名付きパッケージは、Web サイトにコピーし、pkgadd コマンドと URL を使用してインストールするのに適しています。