SSO に使用する鍵と証明書を生成する

Google Workspace では、Google Workspace または Google Workspace for Education をご利用のお客様にシングル サインオン(SSO)サービスを提供しています。Google Workspace シングル サインオン サービスでは、RSA または DSA のアルゴリズムを使用して生成された公開鍵と証明書を採用しています。このサービスを使用するには、公開鍵と秘密鍵のセットと、公開鍵を含む X.509 証明書を生成する必要があります。公開鍵または証明書を取得したら、Google に登録する必要があります。これを行うには、Google 管理コンソールから鍵または証明書をアップロードします。

鍵と証明書を生成する方法は、多くの場合、開発プラットフォームとプログラミング言語の設定によって異なります。Google Workspace SSO サービスに必要な鍵と証明書を生成する方法はいくつかあります。

OpenSSL を使用する

公開鍵と秘密鍵の鍵ペアを作成する方法は多数ありますが、オープンソースの OpenSSL ツールは最も一般的な方法の一つです。すべての主要なプラットフォームに移植されており、鍵生成用のシンプルなコマンドライン インターフェースを提供します。

RSA 秘密鍵を生成する

OpenSSL の次のコマンドを実行するだけで RSA 秘密鍵を生成できます。

openssl genrsa -out rsaprivkey.pem 2048

このコマンドは、PEM エンコードされた秘密鍵を生成し、ファイル rsaprivkey.pem に保存します。この例では、ほぼすべての目的に対応できる 2, 048 ビットの鍵を作成します。生成された秘密鍵は秘密に保管してください。データの署名と復号に使用されます。

一部の実装(特に Java ベース)では、DER または PKCS8 が必要になる場合があります。これらは、たとえば次の追加手順で生成できます。

  1. openssl rsa -in rsaprivkey.pem -pubout -outform DER -out rsapubkey.der
  2. openssl pkcs8 -topk8 -inform PEM -outform DER -in rsaprivkey.pem -out rsaprivkey.der -nocrypt

手順 1 で、DER 形式の公開鍵が生成されます。

ステップ 2 では、pkcs8 形式と DER 形式で秘密鍵を生成します。生成された鍵(rsapubkey.der と rsaprivkey.der)を使用できます。

DSA 秘密鍵を生成する

DSA 鍵を生成するには次の 2 つの手順を実施します。

  1. openssl dsaparam -out dsaparam.pem 2048
  2. openssl gendsa -out dsaprivkey.pem dsaparam.pem

最初のステップでは、DSA パラメータ ファイル dsaparam.pem を作成します。この場合、OpenSSL はステップ 2 で 2,048 ビットの鍵を作成します。dsaparam.pem ファイル自体は鍵ではなく、公開鍵と秘密鍵が作成された後に破棄できます。2 番目のステップでは、秘密鍵をファイル dsaprivkey.pem に作成します。このファイルは秘密にしておく必要があります。

鍵を DER(バイナリ)形式で書き出すには、次の手順を実施します。

  1. openssl dsa -in dsaprivkey.pem -outform DER -pubout -out dsapubkey.der
  2. openssl pkcs8 -topk8 -inform PEM -outform DER -in dsaprivkey.pem -out dsaprivkey.der -nocrypt

手順 1 で、公開鍵が DER 形式で書き出されます。

ステップ 2 では、秘密鍵を pkcs8 形式と DER 形式に変換します。完了したら、この公開鍵(dsapubkey.der)と秘密鍵(dsaprivkey.der)の鍵ペアを使用できます。

証明書を生成する

鍵ペアを取得したら、X.509 証明書を簡単に作成できます。証明書には、対応する公開鍵と、証明書を作成した組織に関連するメタデータが格納されます。RSA または DSA 秘密鍵から自己署名証明書を作成する手順は次のとおりです。

openssl req -new -x509 -key dsaprivkey.pem -out dsacert.pem

いくつかの質問に答えると、証明書が作成され、dsacert.pem として保存されます。これは、SSO の構成時にコントロール パネルから Google Workspace にアップロードするファイルです。

証明書のフィンガープリントを作成する

アプリケーションによっては、X.509 証明書自体ではなく、X.509 証明書のフィンガープリントが必要になる場合があります。フィンガープリントは、x509 バイナリ形式の証明書のダイジェストです。フィンガープリントのタイプは、フィンガープリントの生成に使用されるアルゴリズム(SHA-1 や SHA-256 など)によって異なります。

X.509 証明書から SHA-256 フィンガープリントを作成するには、次のコマンドを使用します(実際の証明書の .pem ファイル名に置き換えてください)。

openssl x509 -noout -fingerprint -sha256 -inform pem -in "GoogleIDPCertificate-domain.com.pem"

Microsoft Visual Studio for .NET を使用する

Microsoft Visual Studio 2005 には、Google Workspace で使用する証明書を生成するためのユーティリティ(Common7ToolsBin ディレクトリ内)が用意されています。.NET で公開鍵と秘密鍵のペアと証明書を作成する手順は次のとおりです。

  1. makecert -r -pe -n "CN=Test Certificate" -sky exchange -sv testcert.pvk testcert.cer
  2. pvk2pfx -pvk testcert.pvk -spc testcert.cer -pfx testcert.pfx

上記のコマンドでは、デフォルトで RSA アルゴリズムが使用されます。ステップ 1 では、証明書作成ツール(makecert.exe)を使用して、testcert.cer という名前の自己署名 X.509 証明書と、対応する秘密鍵を作成します。

ステップ 2 では、pvk2pfx ツール(pvk2pfx.exe)を使用して、CER ファイルと PVK ファイルから Personal Information Exchange(PFX)ファイルを作成します。PFX には、公開鍵と秘密鍵の両方が含まれています。

ステップ 1 で作成した testcert.cer ファイルは、コントロール パネルを使用して Google Workspace にアップロードできます。ステップ 2 の testcert.pfx を使用して、SAML レスポンスに署名するための X509Certificate2(.NET 2.0+)インスタンスを作成できます。

Java で keytool を使用する

Java デベロッパーは、標準の JDK に含まれている keytool ユーティリティを使用して、公開鍵/秘密鍵のペアと X.509 証明書を作成できます。keytool は、ユーザーが独自の公開鍵/秘密鍵ペアと、デジタル署名を必要とする認証スキームで使用する関連証明書を管理できるようにする鍵と証明書の管理ユーティリティです。keytool は、鍵と証明書を「キーストア」に保存します。デフォルトの実装では、キーストアはユーザーのホーム ディレクトリにあるファイル(.keystore)です。秘密鍵はパスワードで保護されます。

DSA 鍵ペアを作成する

  1. keytool -genkey -alias dsassokey -keyalg "DSA" -keysize 2048 -validity 180 -sigalg "SHA256withDSA"
  2. keytool -export -alias dsassokey -file dsasso.cer

ステップ 1 では、DSA アルゴリズムを使用して、サイズが 2048、有効期間が 180 日の公開鍵/秘密鍵ペアを生成します。

ステップ 2 では、公開鍵から X.509 証明書(dsasso.cer)を生成します。次に、コントロール パネルを使用して dsasso.cer を Google Workspace にアップロードします。

RSA 鍵ペアを作成する

  1. keytool -genkey -alias rsassokey -keyalg "RSA" -keysize 2048 -validity 180
  2. keytool -export -alias rsassokey -file rsasso.cer

ステップ 1 では、RSA アルゴリズムを使用して、サイズ 2048、有効期間 180 日の公開鍵/秘密鍵ペアを生成します。

ステップ 2 では、公開鍵から X.509 証明書(rsasso.cer)を生成します。次に、コントロール パネルを使用して rsasso.cer を Google Workspace にアップロードします。

Java 暗号化アーキテクチャを使用する

Java 暗号化アーキテクチャ(JCA)は、セキュリティ プロパティを生成して操作するためのコアクラスとインターフェースを提供します。JCA には、暗号化に関連する Java 2 SDK Security API の部分が含まれています。この API を使用すると、目的のアルゴリズムで公開鍵と秘密鍵のペアを簡単に生成できます。以下は、Google Workspace SSO サービスで使用する DSA 鍵または RSA 鍵を作成するサンプルコードです。

公開鍵と秘密鍵の鍵ペアを作成する

import java.io.*;
import java.security.*;

public class KeyGenDSA {

  public static void main(String[] args) {
        try {
          KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");
          SecureRandom random = SecureRandom.getInstanceStrong();
          keyGen.initialize(2048, random);

          KeyPair pair = keyGen.generateKeyPair();
          PrivateKey priv = pair.getPrivate();
          PublicKey pub = pair.getPublic();

          byte[] encPriv = priv.getEncoded();
          FileOutputStream privfos = new FileOutputStream("DSAPrivateKey.key");
          privfos.write(encPriv);
          privfos.close();

          byte[] encPub = pub.getEncoded();
          FileOutputStream pubfos = new FileOutputStream("DSAPublicKey.key");
          pubfos.write(encPub);
          pubfos.close();

   } catch (Exception e) {
         e.printStackTrace();
   }
  }
}

上記のコードでは、KeyPairGenerator を使用して DSA 鍵のペアを作成しています。生成された鍵はバイナリ形式で、個別のファイルに出力されます。鍵を取得したら、公開鍵を Google Workspace に登録し、秘密鍵を使用して SAMLResponse に署名します。DSA ではなく RSA 鍵のペアを生成するには、コード内の "DSA" を "RSA" に置き換えるだけです。

証明書または公開鍵を Google Workspace に登録する

鍵と証明書の生成という難しい部分を完了したら、次の部分は非常に簡単です。証明書または公開鍵を Google Workspace に登録するには、管理コンソールに移動して管理者としてログインする必要があります。[セキュリティ]、[シングル サインオン(SSO)の設定] の順に選択し、[サードパーティの ID プロバイダで SSO を設定する] のページにあるすべてのフィールドに入力します。