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 を作成します。このファイルは、ステップ 2 で 2,048 ビットの鍵を作成するよう OpenSSL に指示します。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 アルゴリズムを使用して、サイズ 2,048、有効期間 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 アルゴリズムを使用して、サイズ 2,048、有効期間 180 日の公開鍵/秘密鍵ペアを生成します。

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

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

Java Cryptography Architecture(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 を設定する] の下のページにあるすべてのフィールドに入力します。