Skip to main content
  1. Posts/

自主身份:SSI 技术实践

·

更安全方便地管理、分享和验证身份信息。

自主身份(Self-Sovereign Identity)是一种以用户为中心的数字身份机制,允许用户和组织完全控制他们的身份信息。因此,SSI 能让任何人可靠地分享和证明其身份,同时不牺牲隐私。

基本原理 #

SSI 能让我们像在现实中用纸质文件和卡片一样建立自己的数字身份,并且任何人都能可靠地在线上或者线下验证这些身份。这样一来,SSI 就能在去中心化的生态系统中让用户交换身份信息。在这类系统中存在三类角色:

  • 签发者 Issuers - 签发数字身份给个人或组织(Holders)的一方,是 SSI 系统中的数据源
  • 持有者 Holders - 从不同 Issuers 处接收包含自身身份信息的数字身份的个人或组织。通过聚合和存储这些数字身份,Holders 能构建出一套完整的并完全由自己控制的数字身份
  • 验证者 Verifiers - 需要验证上述数字身份从而提供产品和服务的一方

一般来说,个人或组织在一次交互中只会担任其中一个角色,但担任多个角色的情况也十分常见。比如 Issuer 和 Verifier 经常是重合的。

技术概念 #

首先需要了解一些核心概念:

  • Registries - 提供共享的、可信的特定信息,可以认为是可信数据源
  • 密钥 - 通过密码学控制和处理数字身份信息,例如加密和认证
  • Decentralized Identifiers(DIDs)- 通过将密钥对应到唯一的标识符来建立一套公钥基础设施
  • Verifiable Credentials(VCs)- 包含数字身份的“证件”,可以方便地分享和验证,同时保护隐私。需要注意,出于隐私和合规性原因,它们不会被存储在区块链上
  • Protocols - 不同主体间交换 VC 的协议
  • Wallets - 用于存储密钥和 VC,让我们能通过简单易用的应用程序来管理和分享数字身份

SSI 的这些核心概念构成了整个技术栈:

技术栈中的每个模块都可以采用不同的技术来实现,于是会诞生不同类型的 SSI 系统。因此,在构建 SSI 系统时,技术和服务选型是需要考虑的重要问题。

完整的身份认证过程则如下图所示,Issuers 首先创建身份信息并签名,随后签发给 Holders。Holders 负责管理这些身份信息,并向 Verifiers 出示合适的身份信息。Verifiers 对其进行验证,通过后提供服务。整个过程依赖于可信的 Registry,并且均涉及对 DID 的读写。

技术细节 #

密钥比较容易理解,这里不再作介绍。

Registries #

SSI 系统中的所有参与者都可以信任 Registries,因此 Registries 是分布式公钥基础设施 DPKI 的基础,也是所有可信数据的来源。我们可以使用不同技术来实现 Registries,例如:

  • 区块链或 L1:通常我们利用其不可篡改性来防止参与者修改身份信息数据,如今使用的较多的是带权限控制的区块链(例如可以指定特定的组拥有写权限),比如 Ethereum Quorum
  • L2:L2 网络位于区块链上层并能聚合数据,从而更好地解决传统区块链的可扩展性和成本问题,其中和数字身份相关的实现有 Bitcoin 的 ION 和 Ethereum 的 Element 等
  • 其他分布式账本技术(DLTs):例如 IPFS,但在数字身份领域作用有限
  • DNS:尽管不完全是分布式的,DNS 因为成熟和普及也常被用作 Registries

值得注意,实现 SSI 并不一定需要实现 Registries,但实现 Registries 能更好地融合其它基于 DPKI 和可信 Registries 的服务。

Decentralized Identifiers (DIDs) #

DID 是 W3C 标准化的一种唯一标识符,用于构建 DPKI 使得参与者能发现彼此,并认证、加密、签名和验证数据。

DID 存在多种不同实现,也各有优劣。许多实现依赖于 Registries,例如 did:ebsi 依赖 EBSI、did:web 依赖 DNS,但一些新的实现并不需要 Registries 因为其分发机制基于 peer-to-peer 的交互,例如 did:key。

举个例子,did:ebsi:2A9RkiYZJsBHT1nSB3HZAwYMNfgM7Psveyodxrr8KgFvGD5y 会被解析为如下 DID document:

{
  "@context": ["https://w3id.org/did/v1"],
  "authentication": [
    "did:ebsi:2A9RkiYZJsBHT1nSB3HZAwYMNfgM7Psveyodxrr8KgFvGD5y#1a7514b2d58141c3982021a6323b99bf"
  ],
  "id": "did:ebsi:2A9RkiYZJsBHT1nSB3HZAwYMNfgM7Psveyodxrr8KgFvGD5y",
  "verificationMethod": [
    {
      "controller": "did:ebsi:2A9RkiYZJsBHT1nSB3HZAwYMNfgM7Psveyodxrr8KgFvGD5y",
      "id": "did:ebsi:2A9RkiYZJsBHT1nSB3HZAwYMNfgM7Psveyodxrr8KgFvGD5y#1a7514b2d58141c3982021a6323b99bf",
      "publicKeyJwk": {
        "alg": "EdDSA",
        "crv": "Ed25519",
        "kid": "1a7514b2d58141c3982021a6323b99bf",
        "kty": "OKP",
        "use": "sig",
        "x": "tqJADByHRU3YxswewQD4wQYXU9tB43j3PfjofsYEvqs"
      },
      "type": "Ed25519VerificationKey2018"
    }
  ]
}

Verifiable Credentials (VCs) #

实际的身份数据就存储在 VC 和 VP 中。VC 由 Issuers 签发,通常至少包含:

  • Issuer 的 DID
  • 接收者(Holder)的 DID
  • VC 的有效性相关信息
  • 接收者的属性,如名字、年龄、地址等
  • Issuer 的签名和其他信息

一个典型的 VC 长这样:

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://essif.europa.eu/schemas/v-a/2020/v1",
    "https://essif.europa.eu/schemas/eidas/2020/v1"
  ],
  "id": "education#higherEducation#3fea53a4-0432-4910-ac9c-69ah8da3c37f",
  "type": ["VerifiableCredential", "VerifiableAttestation"],
  "issuer": "did:ebsi:2757945549477fc571663bee12042873fe555b674bd294a3",
  "issuanceDate": "2019-06-22T14:11:44Z",
  "validFrom": "2019-06-22T14:11:44Z",
  "credentialSubject": {
    "id": "id111"
  },
  "credentialStatus": {
    "id": "https://essif.europa.eu/status/identity#verifiableID#1dee355d-0432-4910-ac9c-70d89e8d674e",
    "type": "CredentialStatusList2020"
  },
  "credentialSchema": {
    "id": "https://essif.europa.eu/tsr-vid/verifiableid1.json",
    "type": "JsonSchemaValidator2018"
  },
  "evidence": [
    {
      "id": "https://essif.europa.eu/tsr-va/evidence/f2aeec97-fc0d-42bf-8ca7-0548192d5678",
      "type": ["DocumentVerification"],
      "verifier": "did:ebsi:2962fb784df61baa267c8132497539f8c674b37c1244a7a",
      "evidenceDocument": "Passport",
      "subjectPresence": "Physical",
      "documentPresence": "Physical"
    }
  ],
  "proof": {
    "type": "EidasSeal2021",
    "created": "2019-06-22T14:11:44Z",
    "proofPurpose": "assertionMethod",
    "verificationMethod": "did:ebsi:2757945549477fc571663bee12042873fe555b674bd294a3#2368332668",
    "jws": "HG21J4fdlnBvBA+y6D...amP7O="
  }
}

Verifiable Presentations (VPs) #

VP 则由 Holders 创建和签名,包含了来自一个或多个 VC 的身份信息,用于出示给 Verifier。VP 通常至少包含

  • VC 或者 VC 的一部分(例如部分个人属性)
  • 接收者(Holders)的签名

一个典型的 VP 长这样:

{
  "@context": ["https://www.w3.org/2018/credentials/v1"],
  "type": ["VerifiableCredential", "VerifiablePresentation"],
  "verifiableCredential": [
    {
      "@context": [
        "https://www.w3.org/2018/credentials/v1",
        "https://essif.europa.eu/schemas/vc/2020/v1"
      ],
      "credentialSubject": {
        "id": "did:ebsi:00000004321",
        "naturalPerson": {
          "did": "did:example:00001111"
        }
      },
      "id": "did:ebsi-eth:00000001/credentials/1872",
      "issuanceDate": "2020-08-24T14:13:44Z",
      "issuer": "did:ebsi:000001234",
      "proof": {
        "created": "2020-08-24T14:13:44Z",
        "jws": "eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19.",
        "proofPurpose": "assertionMethod",
        "type": "EcdsaSecp256k1Signature2019",
        "verificationMethod": "did:ebsi-eth:000001234#key-1"
      },
      "type": ["VerifiableCredential", "VerifiableAuthorization"]
    },
    {
      "@context": [
        "https://www.w3.org/2018/credentials/v1",
        "https://w3id.org/citizenship/v1"
      ],
      "credentialSubject": {
        "birthDate": "1958-08-17",
        "givenName": "JOHN",
        "id": "did:example:123",
        "type": ["PermanentResident", "Person"]
      },
      "issuer": "did:example:456",
      "proof": {
        "created": "2020-04-22T10:37:22Z",
        "jws": "eyJjcml0IjpbImI2NCJdLCJiNjQiOmZhbHNlLCJhbGciOiJFZERTQSJ9..BhWew0x-txcroGjgdtK-yBCqoetg9DD9SgV4245TmXJi-PmqFzux6Cwaph0r-mbqzlE17yLebjfqbRT275U1AA",
        "proofPurpose": "assertionMethod",
        "type": "Ed25519Signature2018",
        "verificationMethod": "did:example:456#key-1"
      },
      "type": ["VerifiableCredential", "PermanentResidentCard"]
    }
  ]
}

Protocols #

VC 和 VP 的传输需要一个安全的协议,通常参与者间的通信建立在双向认证的加密信道上。最常用的 SSI 数据交换协议包括:

  • OIDC4SSI / SIOP:认证授权协议 OpenID Connect 的扩展
  • DIDComm:Decentralized Identity Foundation(DIF)专为 SSI 设计的新协议
  • Credential Handler API:将用户的身份信息连接到 web 应用的浏览器扩展

技术实践 #

以 walt.id 的 SSI Kit 为例,首先构建 SSI Kit(需要 JDK 16+,并会安装 Gradle 7):

$ ./ssikit.sh build
$ alias ssikit=./ssikit.sh

或直接使用 docker 镜像:

$ alias ssikit=docker run -itv $(pwd)/data:/app/data waltid/ssikit

接下来,以较复杂的与 EBSI/ESSIF 生态结合的完整流程为例,这里需要使用 did:ebsi 并遵循 ESSIF Onboarding -> EBSI Auth API -> ESSIF DID Registration 工作流。而相对简单的 did:keydid:web 的流程类似,且步骤更少。

1. Issuer #

首先生成密钥,注意 did:ebsi 要求使用 ECDSA Secp256k1 密钥 :

$ ssikit key gen -a Secp256k1
# f99c22970c5a430e85bf55120918acfa

使用密钥生成 DID:

$ ssikit did create -m ebsi -k f99c22970c5a430e85bf55120918acfa
# did:ebsi:z25xkb9bFMYnCp4rGegG7a3E
$ ISSUER_DID=did:ebsi:z25xkb9bFMYnCp4rGegG7a3E

将从 https://app.preprod.ebsi.eu/users-onboarding 获得的 token 贴到 issuer/data/bearer-token.txt 中,随后注册 Issuer 的 DID 到 EBSI ledger 上:

$ ssikit essif onboard --did $ISSUER_DID issuer/data/bearer-token.txt
$ ssikit essif auth-api --did $ISSUER_DID
$ ssikit essif did register --did $ISSUER_DID

验证是否能从 EBSI ledger 上获取并解析 DID:

$ ssikit did resolve --did $ISSUER_DID

2. Holder #

与 Issuer 类似:

$ ssikit key gen -a Secp256k1
# aa7c8338bd284ed0ab0db613c8656425
$ ssikit did create -m ebsi -k aa7c8338bd284ed0ab0db613c8656425
# did:ebsi:zn8bsd3Q51ZzjmHzb41BcQp
$ HOLDER_DID=did:ebsi:zn8bsd3Q51ZzjmHzb41BcQp
$ ssikit essif onboard --did $HOLDER_DID holder/data/bearer-token.txt
$ ssikit essif auth-api --did $HOLDER_DID
$ ssikit essif did register --did $HOLDER_DID
$ ssikit did resolve --did $HOLDER_DID

3. Issuer #

用学位证明模版 VerifiableDiploma 签发两个证明(VC):

$ ssikit vc issue -i $ISSUER_DID -s $HOLDER_DID -t VerifiableDiploma --interactive issuer/data/bachelor.json
$ ssikit vc issue -i $ISSUER_DID -s $HOLDER_DID -t VerifiableDiploma --interactive issuer/data/master.json

发送给 Holder:

$ cp issuer/data/*.json holder/data

注意这里使用 cp 来模拟发送操作,实际应用中往往需要额外的 Data Exchange Protocols 来安全传输 VC 和 VP。

4. Holder #

用两个 VC 生成 VP:

$ ssikit vc present --holder-did $HOLDER_DID holder/data/bachelor.json holder/data/master.json

发送给 Verifier:

$ cp data/vc/presented/vp-1657865675707.json verifier/data

5. Verifier #

验证 VC 和 VP,这里需要验证:

  • Issuer 和 Holder 的 DID(从 EBSI ledger 获取)
  • VP 中每个 VC 的签名
  • VP 自身的签名
$ ssikit vc verify -p TrustedIssuerDidPolicy -p TrustedSubjectDidPolicy -p JsonSchemaPolicy -p SignaturePolicy verifier/data/vp-1657865675707.json

需要注意的是,-p 参数设置的验证规则顺序很重要。在上述命令中,Verifier 会先检查 Issuer 和 Holder 的 DID,只有验证通过后两者的公钥才会被导入,随后才能用 SignaturePolicy 检查签名。

使用场景 #

SSI 技术在身份认证相关领域有着广泛的用途,例如:

  • IAM,可替代注册-登录流程,用于认证已知的用户和参与者
  • 身份证明与验证,和 IAM 相对,用于认证未知的用户和参与者
  • 风险与合规性检查,即检查身份信息以外的其他背景信息
  • 数字身份,可替代传统的纸质身份文件/证件,更容易管理、分享和验证且更难伪造
  • 关联身份的钱包应用

参考资料 #

  1. SSI | Basics
  2. Technologies & Concepts
  3. Decentralized Identifiers (DIDs) v1.0
  4. Verifiable Credentials Data Model v1.1
  5. Build end-to-end use cases
  6. Use cases