建立單一登入 (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 檔案中。這個範例會建立 2048 位元金鑰,幾乎適用於任何用途。產生的私密金鑰應保密,用於簽署及解密資料。

部分實作 (尤其是以 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 金鑰需要下列兩個步驟:

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

第一個步驟會建立 DSA 參數檔案 dsaparam.pem,在本例中,這個檔案會指示 OpenSSL 在步驟 2 建立 2048 位元金鑰。dsaparam.pem 檔案本身並非金鑰,在建立公開和私密金鑰後即可捨棄。第二個步驟會在檔案 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"

在 .NET 中使用 Microsoft Visual Studio

Microsoft Visual Studio 2005 提供公用程式 (位於 Common7ToolsBin 目錄),可用來產生與 Google Workspace 搭配使用的憑證。請按照下列步驟,在 .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 檔案建立個人資訊交換 (PFX) 檔案。PFX 包含您的公開和私密金鑰。

您可以使用控制台將步驟 1 建立的 testcert.cer 檔案上傳至 Google Workspace,並使用步驟 2 的 testcert.pfx 建立 X509Certificate2 (.NET 2.0+) 執行個體,以便簽署 SAML 回應。

在 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 Cryptography Architecture

Java Cryptography Architecture (JCA) 提供核心類別和介面,用於產生及操控安全性屬性。JCA 包含 Java 2 SDK Security API 中與密碼編譯相關的部分。使用這個 API,您就能輕鬆以所需演算法產生公開和私密金鑰組。以下是建立 DSA 或 RSA 金鑰,以便與 Google Workspace SSO 服務搭配使用的程式碼範例。

建立公開和私密金鑰組

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。如要產生一組 RSA 金鑰而非 DSA,只要將程式碼中的 "DSA" 替換為 "RSA" 即可。

向 Google Workspace 註冊憑證或公開金鑰

完成產生金鑰和憑證的棘手部分後,接下來的部分就非常簡單。如要向 Google Workspace 註冊憑證或公開金鑰,請前往管理控制台,並以管理員身分登入。依序選取「Security」(安全性) 和「Set up single sign-on (SSO)」(設定單一登入 (SSO)),然後在「Setup SSO with third party identity provider」(透過第三方識別資訊提供者設定 SSO) 下方填寫頁面上的所有欄位。