# Create and Publish Your Own did:web

By [mhrsntrk](https://paragraph.com/@mhrsntrk) · 2022-08-12

---

If you are reading this post, I assume you are already heard of Self-Sovereign Identity (SSI) concept and Decentralized Identifier (DID). In this post, I will show you how to create a DID and publish it using one of the most basic DID method available, `did:web`.

Before diving into technical details. Let's refresh our knowledge about DIDs.

*   DID is a globally unique identifier made up of a string of letters and numbers
    
*   DID is created and owned by the user
    
*   DID allows the owner to prove cryptographic control over it
    
*   DID comes with a private key and a public key that are also made up of a long string of letters and numbers
    
*   DID enables private and secure connections between two parties and can be verified anywhere at any time
    

![Public Key Cryptography](https://storage.googleapis.com/papyrus_images/e4923662c9502dbaae7305a3e5d3fcaa0ab17807098400f8c46dd604aa223c67.jpg)

Public Key Cryptography

Create a DID Document
---------------------

> Before we start, you can take a look at the [did:web method standard](https://w3c-ccg.github.io/did-method-web/#json-ld-context-definition).

You can create a did:web manually by creating a public-private key pair and creating a JSON-LD file. But, it is good to use a tool for making things easier. For this post, I will use `didkit` from [SpruceID](https://www.spruceid.com/), but there are also lots of other tools available on the market today.

#### 1\. Install `didkit` CLI

*   `didkit` implemented using Rust, so first we need to install Rust first. You can follow the [official instructions](https://doc.rust-lang.org/cargo/getting-started/installation.html) to install Rust on your machine.
    
*   After you successfully install Rust, we can install the `didkit-cli` using the below command.
    

    cargo install didkit-cli
    

#### 2\. Generate a key pair

*   You can use the command below to generate a fresh pair of Ed25519 key pair and store it locally.
    

    didkit generate-ed25519-key > issuer_key.jwk
    

> In later steps we will link the public key to our DID and it will be used for signing credentials, so keep your keys safe otherwise you cannot issue new credentials.

#### 3\. Generate a `did:key` document using the generated keys

*   You can use the command below to generate a `did:key` document using previously generated Ed25519 key pair and store it locally.
    

    did=$(didkit key-to-did key -k issuer_key.jwk)
    printf 'DID: %s\n\n' "$did"
    didkit did-resolve `didkit key-to-did key -k issuer_key.jwk` > issuer_key_did_doc.json
    

*   The command will print the DID, i.e. `did:key:z6MkwJBFYK8vTVGeiMsLzcqbSRXW4aTg4PozGbekWtQNUnnW`
    
*   If you navigate to your home directory and open `issuer_key_did_doc.json` file, you will some content similar to the below example.
    

    {
      "@context": "https://www.w3.org/ns/did/v1",
      "id": "did:key:z6MkwJBFYK8vTVGeiMsLzcqbSRXW4aTg4PozGbekWtQNUnnW",
      "verificationMethod": [
        {
          "id": "did:key:z6MkwJBFYK8vTVGeiMsLzcqbSRXW4aTg4PozGbekWtQNUnnW#z6MkwJBFYK8vTVGeiMsLzcqbSRXW4aTg4PozGbekWtQNUnnW", 
          "type": "Ed25519VerificationKey2018",
          "controller": "did:key:z6MkwJBFYK8vTVGeiMsLzcqbSRXW4aTg4PozGbekWtQNUnnW",
          "publicKeyJwk": {
            "kty": "OKP",
            "crv": "Ed25519",
            "x": "-kMHp5nohaFOK5E9Jch4ErdgwMFYFUc4Lt_wYlAGy8s"
          }
        }
      ],
      "authentication": [
        "did:key:z6MkwJBFYK8vTVGeiMsLzcqbSRXW4aTg4PozGbekWtQNUnnW#z6MkwJBFYK8vTVGeiMsLzcqbSRXW4aTg4PozGbekWtQNUnnW"
      ],
      "assertionMethod": [
        "did:key:z6MkwJBFYK8vTVGeiMsLzcqbSRXW4aTg4PozGbekWtQNUnnW#z6MkwJBFYK8vTVGeiMsLzcqbSRXW4aTg4PozGbekWtQNUnnW"
      ]
    }
    

#### 4\. Change the document from `did:key` to `did:web`

*   You need to open the file using a text editor.
    
*   Change every instance of `did:key:z6MkwJBFYK8vT...` to `did:web:<yourwebsite.com>`, without the **https://** prefix.
    
*   Change the key names from `#z6MkwJBFYK8vT...` to `#owner`.
    
*   Save the file.
    

Publish the DID Document
------------------------

Publishing the DID document mostly depends on your platform, but basically you have to store the file under `https://<yourwebsite.com>/.well-known/did.json` path. For the websites build with React, you only need to place the DID document under `Public > .well-known > did.json`.

Testing
-------

#### 1\. Test using `didkit`

*   You can resolve a DID document using the below command.
    

    didkit did-resolve did:web:<yourwebsite.com>
    

#### 2\. Test using web browser

*   You can navigate to `https://<yourwebsite.com>/.well-known/did.json` to view your DID document.
    

#### 3\. Test using my DID resolver tool

*   You can use my tool to resolve your DID document. You can access the tool using this [link](https://mhrsntrk.com/swissknife/did-resolver).

---

*Originally published on [mhrsntrk](https://paragraph.com/@mhrsntrk/create-and-publish-your-own-did-web)*
