{ "info": { "author": "Blockcerts", "author_email": "info@blockcerts.org", "bugtrack_url": null, "classifiers": [], "description": "[![Build Status](https://travis-ci.org/blockchain-certificates/cert-issuer.svg?branch=master)](https://travis-ci.org/blockchain-certificates/cert-issuer)\n[![PyPI version](https://badge.fury.io/py/cert-issuer.svg)](https://badge.fury.io/py/cert-issuer)\n\n\n# cert-issuer\n\nThe cert-issuer project issues blockchain certificates by creating a transaction from the issuing institution to the\nrecipient on the Bitcoin blockchain that includes the hash of the certificate itself. \n\n## Web resources\nFor development or testing using web requests, check out the documentation at [docs/web_resources.md](./docs/web_resources.md).\n\n# Quick start using Docker\n\n## Getting the Docker image\nThis uses bitcoind in regtest mode. This route makes many simplifications to allow a quick start, and is intended for\nexperimenting only.\n\n1. First ensure you have Docker installed. [See our Docker installation help](docs/docker_install.md).\n\n2. Clone the repo and change to the directory\n\n ```\n git clone https://github.com/blockchain-certificates/cert-issuer.git && cd cert-issuer\n ```\n\n\n3. From a command line in cert-issuer dir, build your docker container:\n \n ```\n docker build -t bc/cert-issuer:1.0 .\n ```\n\n4. Read before running!\n\n - Once you launch the docker container, you will make some changes using your personal issuing information. This flow mirrors what you would if you were issuing real certificates.\n - To avoid losing your work, you should create snapshots of your docker container. You can do this by running:\n\n ```\n docker ps -l\n docker commit my_cert_issuer\n ```\n\n5. When you're ready to run:\n\n ```\n docker run -it bc/cert-issuer:1.0 bash\n ```\n\n## Create issuing address\n\n__Important__: this is a simplification to avoid using a USB, which needs to be inserted and removed during the\nstandard certficate issuing process. Do not use these addresses or private keys for anything other than experimenting.\n\nEnsure your docker image is running and bitcoind process is started\n\n1. Create an 'issuing address' and save the output as follows:\n\n ```\n issuer=`bitcoin-cli getnewaddress`\n sed -i.bak \"s//$issuer/g\" /etc/cert-issuer/conf.ini\n bitcoin-cli dumpprivkey $issuer > /etc/cert-issuer/pk_issuer.txt\n ```\n \n2. Don't forget to save snapshots so you don't lose your work (see step 3 of client setup)\n\n## Issuing certificates\n\n1. Add your certificate to /etc/cert-issuer/data/unsigned_certificates/. \n\n ```\n # To use a sample unsigned certificate as follows:\n cp /cert-issuer/examples/data-testnet/unsigned_certificates/3bc1a96a-3501-46ed-8f75-49612bbac257.json /etc/cert-issuer/data/unsigned_certificates/ \n \n # If you created your own unsigned certificate using cert-tools (assuming you placed it under data/unsigned_certificates):\n cp /data/unsigned_certificates/.json /etc/cert-issuer/data/unsigned_certificates/\n ```\n\n2. Make sure you have enough BTC in your issuing address.\n\n a. You're using bitcoind in regtest mode, so you can print money. This should give you 50 (fake) BTC:\n\n ```\n bitcoin-cli generate 101\n bitcoin-cli getbalance\n ```\n\n b. Send the money to your issuing address -- note that bitcoin-cli's standard denomination is bitcoins not satoshis! (In our\n app, the standard unit is satoshis.) This command sends 5 bitcoins to the address\n\n ```\n bitcoin-cli sendtoaddress $issuer 5\n ```\n\n3. Issue the certificates on the blockchain\n\n ```\n cert-issuer -c /etc/cert-issuer/conf.ini\n ```\n \n4. Your Blockchain certificates are located in `/etc/cert-issuer/data/blockchain_certificates`. Copy these to your local machine, and add them to cert-viewer's `cert_data` folder to see your certificates in the Certificate Viewer.\n\n```\ndocker ps // shows the docker containerId\ndocker cp :/etc/cert-issuer/data/blockchain_certificates /cert-viewer/cert_data\n```\n\n# How batch issuing works\n\nWhile it is possible to issue one certificate with one Bitcoin transaction, it is far more efficient to use one Bitcoin transaction to issue a batch of certificates. \n\nThe issuer builds a Merkle tree of certificate hashes and registers the Merkle root as the OP_RETURN field in the Bitcoin transaction. \n\nSuppose the batch contains `n` certificates, and certificate `i` contains recipient `i`'s information. The issuer hashes each certificate and combines them into a Merkle tree:\n\n![](img/merkle.png)\n\n\nThe root of the Merkle tree, which is a 256-bit hash, is issued on the Bitcoin blockchain. The complete Bitcoin transaction outputs are described in 'Transaction structure'.\n\nThe Blockchain Certificate given to recipient `i` contains a [2017 Merkle Proof Signature Suite](https://w3c-dvcg.github.io/lds-merkleproof2017/)-formatted signature, proving that certificate `i` is contained in the Merkle tree. \n\n![](img/blockchain_certificate_components.png)\n\nThis receipt contains:\n\n* The Bitcoin transaction ID storing the Merkle root\n* The expected Merkle root on the blockchain\n* The expected hash for recipient `i`'s certificate\n* The Merkle path from recipient `i`'s certificate to the Merkle root, i.e. the path highlighted in orange above. `h_i -> \u2026 -> Merkle root`\n\nThe [verification process](https://github.com/blockchain-certificates/cert-verifier-js#verification-process) performs computations to check that:\n\n* The hash of certificate `i` matches the value in the receipt\n* The Merkle path is valid\n* The Merkle root stored on the blockchain matches the value in the receipt\n\nThese steps establish that the certificate has not been tampered with since it was issued.\n\n## Hashing a certificate\n\nThe Blockchain Certificate JSON contents without the `signature` node is the certificate that the issuer created. This is the value needed to hash for comparison against the receipt. Because there are no guarantees about ordering or formatting of JSON, first canonicalize the certificate (without the `signature`) against the JSON LD schema. This allows us to obtain a deterministic hash across platforms.\n\nThe detailed steps are described in the [verification process](https://github.com/blockchain-certificates/cert-verifier-js#verification-process).\n\n\n## What should be in a batch?\n\nHow a batch is defined can vary, but it should be defined such that it changes infrequently. For example, \u201c2016 MIT grads\u201d would be preferred over \u201cMIT grads\u201d (the latter would have to be updated every year). The size of the batch is limited by the 100KB maximum transaction size imposed by the Bitcoin network. This will amount to a maximum of around 2,000 recipients per certificate batch.\n\n## Transaction structure\n\n\nOne Bitcoin transaction is performed for every batch of certificates. There is no limit to the number of certificates that may be included in a batch, so typically batches are defined in logical groups such as \"Graduates of Fall 2017 Robotics Class\".\n\n![](/img/tx_out.png)\n\n\nThe transaction structure is the following:\n\n* Input:\n * Minimal amount of bitcoin (currently ~$.80 USD) from Issuer's Bitcoin address\n* Outputs:\n * OP_RETURN field, storing a hash of the batch of certificates\n * Optional: change to an issuer address\n\nThe OP_RETURN output is used to prove the validity of the certificate batch. This output stores data, which is the hash of the Merkle root of the certificate batch. At any time, we can look up this value on the blockchain to help confirm a claim.\n\nThe Issuer Bitcoin address and timestamp from the transaction are also critical for the verification process. These are used to check the authenticity of the claim, as described in [verification process](https://github.com/blockchain-certificates/cert-verifier-js#verification-process).\n\n# Issuing options\n\nThe Quick Start assumed you are issuing certificates in Bitcoin regtest mode, which doesn't actually write to a public blockchain. To actually write your transaction, you need to run in testnet (with test coins -- not real money) or mainnet (real money).\n\nWe recommend starting in testnet before mainnet.\n\nBy default, cert-issuer does not assume you have a bitcoin/ethereum node running locally, and it uses APIs to look up and broadcast transactions. There is API support for both testnet and mainnet chains. \n\nIf you do want to use a local bitcoin node, [see details about installing and configuring a bitcoin node for use with cert-issuer](docs/bitcoind.md) before continuing.\n\nThese steps walk you through issuing in testnet and mainnet mode. Note that the prerequisites and the configuration for the Bitcoin issuing and the Ethereum issuing differ. \n\n## Prerequisites\n\nDecide which chain (Bitcoin or Ethereum) to issue to and follow the steps. The bitcoin chain is currently best supported by the Blockcerts libraries. Follow the steps for the chosen chain.\n\n### Install cert-issuer\n\nBy default, cert-issuer issues to the Bitcoin blockchain. Run the default setup script if this is the mode you want:\n```\npython setup.py install\n\n```\n\nTo issue to the ethereum blockchain, run the following:\n```\npython setup.py experimental --blockchain=ethereum\n\n```\n\n### Create a Bitcoin issuing address\n\nFirst, ensure you've created an issuing address appropriate for the Bitcoin chain you are using. Please note:\n- regtest or testnet addresses will start with 'm' or 'n'\n- mainnet addresses will start with '1'\n \n __These steps involve storing secure information on a USB. Do not plug in this USB when your computer's wifi is on.__\n\n1. Use bitaddress.org\n - for testnet addresses go to [bitaddress.org?testnet=true](http://bitaddress.org?testnet=true)\n - for mainnet addresses go to [bitaddress.org](http://bitaddress.org)\n2. Create an 'issuing address', i.e. the address from which your certificates are issued.\n - save the unencrypted private key to a file (we recommend to store it on a removable drive for security).\n - save the public address as the `issuing_address` value in conf.ini\n\nIf you are using a local bitcoin node, you can create addresses by command line. See [bitcoind.md](docs/bitcoind.md)\n\n\n### Create an Ethereum issuing address\n\nCurrently Blockcerts just supports issuing to the Ropsten Ethereum testnet, and the Ethereum mainnet. In Ethereum a public/private key pair is the same accross all test/main networks.\n\n __These steps involve storing secure information on a USB. Do not plug in this USB when your computer's wifi is on.__\n \n 1. Create issuing address on Myetherwallet\n - Go to https://www.myetherwallet.com/.\n - For the best security turn off your connection to the internet when you are on the create wallet page.\n 2. Go through the create wallet process\n - Store the private key on the USB stick and unplug it afterwards.\n - Copy the public key to the `issuing_address` value in conf.ini\n\n### Get coins\n\nNote ensure you've transferred sufficient funds to your issuing address to cover the transaction fee. Some notes:\n- The transaction fee is the same no matter the number of certificates in the batch\n- __For Bitcoin:__\n - The default transaction fee used by cert-issuer is 60,000 satoshis for bitcoin (~$2.88 USD, 10/11/2017)\n - Because the transaction fee is a factor in confirmation time, you may decide to increase or decrease this value in the config file (read more about current transaction fee/latency estimates: https://bitcoinfees.21.co/)\n- __For Ethereum:__\n - The default gasprice is set at 20 GWei, which makes the transaction price about 0.00047 ETH (~$0.14 USD, 10/11/2017)\n - Lowering the default setting may impact the confirmation time. Please reference http://ethgasstation.info/ to find a fitting gasprice.\n\n#### Obtaining testnet coins\n\n- Request some testnet coins by searching for \u201cTestnet Faucet\u201d, and entering your issuing public address. It may take a while for the transaction to be confirmed.\n- Important: make sure you follow the guidance of the testnet faucet provider!\n \n#### Obtaining mainnet coins\n\n- If this is your first time purchasing Bitcoin or Ethereum, start by reading starter information:\n - For __Bitcoin__: [https://bitcoin.org/en/getting-started] Specifically, the first section \u201cHow to use Bitcoin\u201d is an overview of choosing a wallet, obtaining your first Bitcoins, and securing your money.\n - For __Ethereum__: https://myetherwallet.github.io/knowledge-base/getting-started/getting-started-new.html - MyEtherWallet's knowledge base getting started entry. \n- Transfer a small amount of money to the issuer address created in step 1.\n\n\n## Configuring cert-issuer \n\nEdit your conf.ini file (the config file for this application). \n\n```\nissuing_address = \n\nchain=\n \nusb_name = \nkey_file = \n\nunsigned_certificates_dir=\nblockchain_certificates_dir=\nwork_dir=\n\nno_safe_mode\n\n# advanced: uncomment the following line if you're running a bitcoin node\n# bitcoind\n```\n\nNotes:\n - The `bitcoind` option is technically not required in `regtest` mode. `regtest` mode _only_ works with a local bitcoin node. The quick start in docker brushed over this detail by installing a regtest-configured bitcoin node in the docker container.\n - The Ethereum option does not support a local (test)node currently. The issuer will broadcast the transaction via the Etherscan API.\n\n## Issuing\n\n1. Add your certificates to data/unsigned_certs/\n\n2. If you've installed the package you can issue certificates by running:\n\n```\npython cert-issuer -c conf.ini\n```\n\n3. Output\n - The Blockchain Certificates will be located in data/blockchain_certificates.\n - If you ran in the mainnet or testnet mode, you can also see your transaction on a live blockchain explorer. \n - For Bitcoin, Blockr.io has explorers for both [testnet](https://tbtc.blockr.io/) and [mainnet](https://blockr.io/).\n - For Ethereum, Etherscan has explorers for [ropsten](https://ropsten.etherscan.io/) and [mainnet](https://etherscan.io/)\n - The transaction id is located in the Blockchain Certificate under `signature.anchors[0].sourceId`\n\n\n# Unit tests\n\nThis project uses tox to validate against several python environments.\n\n1. Ensure you have an python environment. [Recommendations](docs/virtualenv.md)\n\n2. Run tests\n ```\n ./run_tests.sh\n ```\n \n# Class design\n\n## Core issuing classes\n![](img/issuer_main_classes.png)\n\nThe `Issuer` api is quite simple; it relies on `CertificateHandler`s and `Transaction Handler`s to do the work of \nextracting the data to issue on the blockchain, and handling the blockchain transaction, respectively.\n\n`CertificateBatchHandler` manages the certificates to issue on the blockchain. It ensures that all accessors iterate\n certificates in a predictable order. This is critical because the Merkle Proofs must be associated with the correct\n certificate. Python generators are used here to help keep the memory footprint low while reading from files.\n\n- `prepare_batch` \n - performs the preparatory steps on certificates in the batch, including validation of the schema and forming the \n data that will go on the blockchain. Certificate-level details are handled by `CertificateHandler`s\n - returns the hex byte array that will go on the blockchain\n- `finish_batch` ensures each certificate is updated with the blockchain transaction information (and proof in general)\n\n`CertificateHandler` is responsible for reading from and updating a specific certificate (identified by certificate_metadata). \nIt is used exclusively by `CertificateBatchHandler` to handle certificate-level details:\n- `validate`: ensure the certificate is well-formed\n- `sign`: (currently unused)\n- `get_byte_array_to_issue`: return byte array that will be hashed, hex-digested and added to the Merkle Tree\n- `add_proof`: associate a a proof with a certificate (in the current implementation, the proof is embedded in the file)\n\n`TransactionHandler` deals with putting the data on the blockchain. Currently only a Bitcoin implementation exists\n\n## Signing and secret management\n\n![](img/signing_classes.png)\n\nFinalizable signer is a convenience class allowing use of python's `with` syntax. E.g.:\n\n```\n\nwith FinalizableSigner(secret_manager) as fs:\n fs.sign_message(message_to_sign)\n\n```\n\nSecretManagers ensure the secret key (wif) is loaded into memory for signing. FileSecretManager is the only current\nimplemenation.\n\n## Merkle tree generator\n\n![](img/merkle_tree_generator.png)\n\nHandles forming the Merkle Tree, returning the data to put on the blockchain, and returning a python generator of the\nproofs.\n\nThis class structure is intended to be general-purpose to allow other implementations. (Do this carefully if at all.)\n\n# Advanced setup\n- [Installing and using a local bitcoin node](docs/bitcoind.md)\n\n# Publishing To Pypi\n- Create an account for [pypi](https://pypi.org) & [pypi test](https://test.pypi.org)\n- Install [twine](github.com/pypa/twine) - `pip install twine`\n- Increment version in `__init__.py`\n- Remove current items in dist - `rm -rf dist/*`\n- Build cert-issuer - `python setup.py install`\n- Build sdist - `python setup.py sdist`\n- Run pypi test upload - `twine upload --repository-url https://test.pypi.org/legacy/ dist/*`\n- Upload to pypi - `twine upload --repository-url https://upload.pypi.org/legacy/ dist/*`\n\n\n# Examples\n\nThe files in examples/data-testnet contain results of previous runs. \n\n# FAQs\n\n## Checking transaction status\n\nYou can validate your transaction before sending by looking it up by rawtx at blockchain.info. Example:\n\n ```\n curl 'https://blockchain.info/rawtx/45a9306dfe99820eb346bb17ae0b64173ac11cac2d0e4227c7a7cacbcc0bad31?cors=true'\n ```\n\nFor an Ethereum transaction, you'll need to use a different explorer, which might require an API key for raw JSON\noutput. To view a transaction in a web browser, you might try something like this:\n\n- Ethereum Mainnet: https://etherscan.io/tx/0xf537d81667c8011e34e1f450e18fd1c5a8a10c770cd0acdc91a79746696f36a3\n- Ethereum Ropsten (testnet): https://ropsten.etherscan.io/tx/0xf537d81667c8011e34e1f450e18fd1c5a8a10c770cd0acdc91a79746696f36a3\n\n## Mac scrypt problems\n\nIf your install on Mac is failing with a message like the following, try the [workaround described in this thread](https://github.com/ethereum/pyethereum/issues/292).\n\n```\nfatal error: 'openssl/aes.h'\n file not found\n#include \n```\n\n# Contact\n\nContact us at [the Blockcerts community forum](http://community.blockcerts.org/).", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/blockchain-certificates/cert-issuer", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "cert-issuer", "package_url": "https://pypi.org/project/cert-issuer/", "platform": "", "project_url": "https://pypi.org/project/cert-issuer/", "project_urls": { "Homepage": "https://github.com/blockchain-certificates/cert-issuer" }, "release_url": "https://pypi.org/project/cert-issuer/2.0.20/", "requires_dist": null, "requires_python": "", "summary": "Issues blockchain certificates using the Bitcoin blockchain", "version": "2.0.20" }, "last_serial": 5939279, "releases": { "0.0.11": [ { "comment_text": "", "digests": { "md5": "fb7cf91ed45a30a2ef7587ce5123653c", "sha256": "b43b9fed4a0bc7e1fdda1f3b96d4793133dcb91f5d302dddb76e8fb56e9050a0" }, "downloads": -1, "filename": "cert-issuer-0.0.11.tar.gz", "has_sig": false, "md5_digest": "fb7cf91ed45a30a2ef7587ce5123653c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20987, "upload_time": "2017-04-08T22:14:10", "url": "https://files.pythonhosted.org/packages/fd/ba/81a906a52517c545787f1f31063b464bc56bc7518481001b867b2c7d1864/cert-issuer-0.0.11.tar.gz" } ], "0.0.12": [ { "comment_text": "", "digests": { "md5": "fc78157974ea66448dc67db9c26f850a", "sha256": "5194f0f3f41e68a73ef0009cf267da7d88d59b6710c5712e9f78326e55ccb9ea" }, "downloads": -1, "filename": "cert-issuer-0.0.12.tar.gz", "has_sig": false, "md5_digest": "fc78157974ea66448dc67db9c26f850a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21068, "upload_time": "2017-04-13T00:14:07", "url": "https://files.pythonhosted.org/packages/0d/59/a02845ab776b004be78aed6ff1d0f5490d6a98682a659f8ad973a81c6a0c/cert-issuer-0.0.12.tar.gz" } ], "0.0.13": [ { "comment_text": "", "digests": { "md5": "95b357ace2832bddfbfa9b2ff5996036", "sha256": "71e5a13f7794e24ac3c90a7caf436667003450238dc90d9e7b5c591e12d7381f" }, "downloads": -1, "filename": "cert-issuer-0.0.13.tar.gz", "has_sig": false, "md5_digest": "95b357ace2832bddfbfa9b2ff5996036", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21051, "upload_time": "2017-04-13T00:16:58", "url": "https://files.pythonhosted.org/packages/b6/d8/1b822d40148654978257056c2fa2ab41c831f6259009ea6adfe814e15195/cert-issuer-0.0.13.tar.gz" } ], "0.0.14": [ { "comment_text": "", "digests": { "md5": "950152a2f43e40d59001f574625208fa", "sha256": "46e20accba8104d64111ca322bc966736483ad2ffcbd70138c09d85a0a14fda8" }, "downloads": -1, "filename": "cert-issuer-0.0.14.tar.gz", "has_sig": false, "md5_digest": "950152a2f43e40d59001f574625208fa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21339, "upload_time": "2017-04-13T22:41:32", "url": "https://files.pythonhosted.org/packages/ea/02/4a5369f64fd88ce501df95c8e9577fa9314cfafb8add64b849203bc13f1c/cert-issuer-0.0.14.tar.gz" } ], "0.0.15": [ { "comment_text": "", "digests": { "md5": "f82fb4eb23e5762ac7b52b3e2acc7a04", "sha256": "a68bf02044cf2fecde88217b808ba377fc76f0ccf583cc3197b6b114642a5330" }, "downloads": -1, "filename": "cert-issuer-0.0.15.tar.gz", "has_sig": false, "md5_digest": "f82fb4eb23e5762ac7b52b3e2acc7a04", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21455, "upload_time": "2017-04-14T00:52:00", "url": "https://files.pythonhosted.org/packages/7c/59/76b1869cce1a2cc5f530bbe5570ac3dea9f8034e52ee0d9097fb667ed63b/cert-issuer-0.0.15.tar.gz" } ], "0.0.16": [ { "comment_text": "", "digests": { "md5": "17b215c5fefa73cc3de6632027f87840", "sha256": "f9e9902b69797f5dab1af0df5be0b98702764e7e75113c8f393cf9eba3971df2" }, "downloads": -1, "filename": "cert-issuer-0.0.16.tar.gz", "has_sig": false, "md5_digest": "17b215c5fefa73cc3de6632027f87840", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21467, "upload_time": "2017-04-14T01:31:13", "url": "https://files.pythonhosted.org/packages/f4/3b/cfad723e990fe56211de38f5ce42023a6dfbfb3ed41b711630bcf3655b58/cert-issuer-0.0.16.tar.gz" } ], "0.0.17": [ { "comment_text": "", "digests": { "md5": "ab726f3112c6f0f5b8b61db605a781d8", "sha256": "da9d003f0d7b81be785e1effec95e8c8d38664535fa2f20286f2d9369aad97c1" }, "downloads": -1, "filename": "cert-issuer-0.0.17.tar.gz", "has_sig": false, "md5_digest": "ab726f3112c6f0f5b8b61db605a781d8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21460, "upload_time": "2017-04-14T01:32:30", "url": "https://files.pythonhosted.org/packages/ce/fe/20a20b91b2784dc581cb64b58b7b6816d0e3c133be4e3c998b16bd215c28/cert-issuer-0.0.17.tar.gz" } ], "0.0.18": [ { "comment_text": "", "digests": { "md5": "24ce01999de3442f37b2acae407b2973", "sha256": "236fd6717c2318310382cc287c38bccaa7837ead436dad10f2bc3c66394f00cf" }, "downloads": -1, "filename": "cert-issuer-0.0.18.tar.gz", "has_sig": false, "md5_digest": "24ce01999de3442f37b2acae407b2973", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21533, "upload_time": "2017-04-14T19:29:53", "url": "https://files.pythonhosted.org/packages/a2/f2/5b2a5590f9baf52ba79b4fe04ecdb173928066a29ef823afc07f0f5545a9/cert-issuer-0.0.18.tar.gz" } ], "0.0.19": [ { "comment_text": "", "digests": { "md5": "3180091d4e877f760888df830d223d88", "sha256": "a37e0f43de151d697c2647d8dec114fe92e686805348dfa2ec19a38b29442e11" }, "downloads": -1, "filename": "cert-issuer-0.0.19.tar.gz", "has_sig": false, "md5_digest": "3180091d4e877f760888df830d223d88", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21492, "upload_time": "2017-04-14T22:28:04", "url": "https://files.pythonhosted.org/packages/f6/93/d28eed05949370a7ade300895dfa45b4cb4b7748f9937a8349b443d3079a/cert-issuer-0.0.19.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "04492896fa7feb792cb3c787e6924876", "sha256": "b031963a0dc2df75fea17c607e4b13826bb20dd592571073cf96d9b89bdedc02" }, "downloads": -1, "filename": "cert-issuer-0.0.3.tar.gz", "has_sig": false, "md5_digest": "04492896fa7feb792cb3c787e6924876", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21900, "upload_time": "2017-03-10T18:37:36", "url": "https://files.pythonhosted.org/packages/18/d2/c3af523564068576ac5a2576f44bc9c3bebcebdb0a718fea6c7b9d99727c/cert-issuer-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "1004d9b2f1af3c4ffdc770793ebd9479", "sha256": "a9df2266cb3bac655121d5464f13799257c97886196665a3f5bc0f8838f982a6" }, "downloads": -1, "filename": "cert-issuer-0.0.4.tar.gz", "has_sig": false, "md5_digest": "1004d9b2f1af3c4ffdc770793ebd9479", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21935, "upload_time": "2017-03-10T21:53:26", "url": "https://files.pythonhosted.org/packages/68/10/f218ffb97058d73a9c2d84f9f2b221ac6da21cdf614172167fd88d25ea0e/cert-issuer-0.0.4.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "90ad0dacf461f568d6218c09dcad0292", "sha256": "e1c35c73a4509033cfcc071edb7d76584ca62366c966f327ca251bc3c72f9424" }, "downloads": -1, "filename": "cert-issuer-0.0.6.tar.gz", "has_sig": false, "md5_digest": "90ad0dacf461f568d6218c09dcad0292", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20597, "upload_time": "2017-03-17T01:27:43", "url": "https://files.pythonhosted.org/packages/cb/5e/2a3ebcc5a34dac8830529c84701074ae0fd0a93adc3f1fc27b2bb3c38799/cert-issuer-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "480ef7dee5d2af6ccef89f782719773d", "sha256": "08ad27abf4299b30ff556ba4808bff81320f6695a966bb31e0273218c3393d53" }, "downloads": -1, "filename": "cert-issuer-0.0.7.tar.gz", "has_sig": false, "md5_digest": "480ef7dee5d2af6ccef89f782719773d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20557, "upload_time": "2017-03-27T19:19:19", "url": "https://files.pythonhosted.org/packages/de/74/a4b98382711028894c2501ec724a8fc31fd52643dd34d54bc4c457b6bbe6/cert-issuer-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "035b48c62143c4e2ffa144fdc01ca232", "sha256": "6760453f3378b9d723875e8d0fdf92a3fe77c69c012ef2d04c680a6e6fc83ee3" }, "downloads": -1, "filename": "cert-issuer-0.0.8.tar.gz", "has_sig": false, "md5_digest": "035b48c62143c4e2ffa144fdc01ca232", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21263, "upload_time": "2017-03-30T21:03:00", "url": "https://files.pythonhosted.org/packages/2b/09/4da5cb597b0a65b9108f1ab42c66b251de715d0a0751e68243fcfc9daeb7/cert-issuer-0.0.8.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "683f0dfbabc74e299b0fdb6e08417e83", "sha256": "b8c31035758d9e101b7725f49bcfd2d12ee24886dd79cd62f1c3dbd4f99f0fe8" }, "downloads": -1, "filename": "cert-issuer-0.0.9.tar.gz", "has_sig": false, "md5_digest": "683f0dfbabc74e299b0fdb6e08417e83", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21340, "upload_time": "2017-04-01T01:18:07", "url": "https://files.pythonhosted.org/packages/cc/26/cf9f7724b12c14c11af60551533573395203948107ec610c1c4b93d55fc7/cert-issuer-0.0.9.tar.gz" } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "6a20e9c12fa713ee5b6e6262dca3d4c2", "sha256": "a6404c706e35a86d1b7df4b7f9120232ff2a816cc8221a44589050ed92ce3011" }, "downloads": -1, "filename": "cert-issuer-2.0.1.tar.gz", "has_sig": false, "md5_digest": "6a20e9c12fa713ee5b6e6262dca3d4c2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22492, "upload_time": "2017-07-03T21:49:36", "url": "https://files.pythonhosted.org/packages/22/bf/fce0e41136521f8d88e0fe47da4b07b639af05f7db25b2b2ea3b68e22c25/cert-issuer-2.0.1.tar.gz" } ], "2.0.10": [ { "comment_text": "", "digests": { "md5": "be825d69a06cb32777a439eeb547635d", "sha256": "28d3370f253d1c17aa1390dac8ad746e3bc2551b5c1b9d8d0627f003e207f7c8" }, "downloads": -1, "filename": "cert-issuer-2.0.10.tar.gz", "has_sig": false, "md5_digest": "be825d69a06cb32777a439eeb547635d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29224, "upload_time": "2017-10-24T19:25:13", "url": "https://files.pythonhosted.org/packages/5a/ad/f0a5052c3a5959855169c3664cead17e78c264d4aff1975057659d75bf8d/cert-issuer-2.0.10.tar.gz" } ], "2.0.11": [ { "comment_text": "", "digests": { "md5": "411df45d27a51b8a605ee60a4ebac99f", "sha256": "e2619c2c258cdb21181127e1c78d8b2f07af38e4914eb0bbb038f3b0a0f72126" }, "downloads": -1, "filename": "cert-issuer-2.0.11.tar.gz", "has_sig": false, "md5_digest": "411df45d27a51b8a605ee60a4ebac99f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31118, "upload_time": "2017-11-01T03:22:49", "url": "https://files.pythonhosted.org/packages/3b/5a/0745391e8faf0da749399eaa74af5898b538683420edefa2d7144e51bb42/cert-issuer-2.0.11.tar.gz" } ], "2.0.12": [ { "comment_text": "", "digests": { "md5": "e7aa6b9398a2af3c02f6b3564b1a2007", "sha256": "5d60b625c6ec1b6139c53e09ff6a4520bd3b16f30fa2b9bf566f80458368b1d7" }, "downloads": -1, "filename": "cert-issuer-2.0.12.tar.gz", "has_sig": false, "md5_digest": "e7aa6b9398a2af3c02f6b3564b1a2007", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36532, "upload_time": "2018-04-19T18:39:54", "url": "https://files.pythonhosted.org/packages/61/a2/8e3266896ae6aaf0d1633fb2a463e2bbeb08290e2d8ea2dc79caf3b16af8/cert-issuer-2.0.12.tar.gz" } ], "2.0.13": [ { "comment_text": "", "digests": { "md5": "2dfe352f9d960ad8d69c85348cf5830a", "sha256": "3c097c2c7f1672e112360568f2aa6bcb8f1fd24f7a00559ef940f89d7bd5fd04" }, "downloads": -1, "filename": "cert-issuer-2.0.13.tar.gz", "has_sig": false, "md5_digest": "2dfe352f9d960ad8d69c85348cf5830a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36483, "upload_time": "2018-05-11T22:21:16", "url": "https://files.pythonhosted.org/packages/92/d4/abb67f571ece4303f6394c4e6b1c24cc178ee838a56b5a5e607b4c387caf/cert-issuer-2.0.13.tar.gz" } ], "2.0.14": [ { "comment_text": "", "digests": { "md5": "a60c48dc736dce50d99beb78a2b962d5", "sha256": "f5b49b806c963335d1e3b0e023215d7542186cb92895669d7ebb1d519c66db6b" }, "downloads": -1, "filename": "cert-issuer-2.0.14.tar.gz", "has_sig": false, "md5_digest": "a60c48dc736dce50d99beb78a2b962d5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36464, "upload_time": "2018-05-11T22:34:20", "url": "https://files.pythonhosted.org/packages/1e/c6/ab67db4cd80dceae7147730208486ad4362f8104c3c71b862a7a57f8a991/cert-issuer-2.0.14.tar.gz" } ], "2.0.15": [ { "comment_text": "", "digests": { "md5": "44b600c19e1ea9acfe17d908a5ed2f32", "sha256": "f219fde3d0ecc29e5bfc57a3da089f0f33eeb9d1fd85c8c4a26e28204f9c8797" }, "downloads": -1, "filename": "cert-issuer-2.0.15.tar.gz", "has_sig": false, "md5_digest": "44b600c19e1ea9acfe17d908a5ed2f32", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36511, "upload_time": "2018-05-16T18:10:41", "url": "https://files.pythonhosted.org/packages/a6/5d/d5316f5479db73e1ed900f2900e9639c42a428c1edec8ee8dcdab7b527d9/cert-issuer-2.0.15.tar.gz" } ], "2.0.16": [ { "comment_text": "", "digests": { "md5": "dae64a749bb11df4b4bbc9033f7a9b1e", "sha256": "25f343083e6c49f9c9b203f728d087c83f859c47ac825547c3c688f911816c8d" }, "downloads": -1, "filename": "cert_issuer-2.0.16-py3.7.egg", "has_sig": false, "md5_digest": "dae64a749bb11df4b4bbc9033f7a9b1e", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": null, "size": 88956, "upload_time": "2019-06-10T16:34:56", "url": "https://files.pythonhosted.org/packages/d0/2b/72e5697789a9e7f5a32e022a13d32261f0fb9ec0b52fadc92bc14829f912/cert_issuer-2.0.16-py3.7.egg" }, { "comment_text": "", "digests": { "md5": "563d7fe998ef90e2be0da7ab9cecc112", "sha256": "207c75ec4fb826594d135bbf8f3c235a43a5f19c3e5eadf743b508421ad71f6a" }, "downloads": -1, "filename": "cert-issuer-2.0.16.tar.gz", "has_sig": false, "md5_digest": "563d7fe998ef90e2be0da7ab9cecc112", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38282, "upload_time": "2019-06-10T16:34:54", "url": "https://files.pythonhosted.org/packages/89/1c/63010721db9e7c72d4791f5fa01621ff035930d46338c4660679fa066a18/cert-issuer-2.0.16.tar.gz" } ], "2.0.17": [ { "comment_text": "", "digests": { "md5": "5c23c93c9356934d07a1341626517354", "sha256": "9f3f756c0ba556420cb25aeb45284d7b438f2c22442b1780ee37a5ddb8e02052" }, "downloads": -1, "filename": "cert_issuer-2.0.17-py3.7.egg", "has_sig": false, "md5_digest": "5c23c93c9356934d07a1341626517354", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": null, "size": 89473, "upload_time": "2019-06-11T17:00:40", "url": "https://files.pythonhosted.org/packages/89/d8/5667bf44367197eaa01e16f66b3baade8d9ed9c346cdc412b504a509097d/cert_issuer-2.0.17-py3.7.egg" }, { "comment_text": "", "digests": { "md5": "e0fbdd8bd453e4414bdf486aaaef5264", "sha256": "0608aa02f9b6b8419583cd5a184127ec3855144f84e9dbfc675bc34881dc916d" }, "downloads": -1, "filename": "cert-issuer-2.0.17.tar.gz", "has_sig": false, "md5_digest": "e0fbdd8bd453e4414bdf486aaaef5264", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38778, "upload_time": "2019-06-12T12:09:50", "url": "https://files.pythonhosted.org/packages/12/f6/e11e65e47f9231b68b40b291c76e6ab5a1679363166995db30f2cfcdbe18/cert-issuer-2.0.17.tar.gz" } ], "2.0.18": [ { "comment_text": "", "digests": { "md5": "fe5abd2b3e5fae8fe6a1883a5af2d390", "sha256": "7af57bc923b14255f16c5e2c9ec03c2d00298e038ae872286e46f2f8721e8c4c" }, "downloads": -1, "filename": "cert_issuer-2.0.18-py3.7.egg", "has_sig": false, "md5_digest": "fe5abd2b3e5fae8fe6a1883a5af2d390", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": null, "size": 90825, "upload_time": "2019-09-09T21:26:01", "url": "https://files.pythonhosted.org/packages/13/73/49e77d938eb74110489ddad6c68936cd061cf9e4d270f37713c4929d2494/cert_issuer-2.0.18-py3.7.egg" }, { "comment_text": "", "digests": { "md5": "9e78dd1c8308763b1c64fea61ed859f0", "sha256": "fe6a95c9d8c630d1f877f0224ab4d54f346dea6268e278204868dde0bd975d89" }, "downloads": -1, "filename": "cert-issuer-2.0.18.tar.gz", "has_sig": false, "md5_digest": "9e78dd1c8308763b1c64fea61ed859f0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39190, "upload_time": "2019-09-09T21:25:59", "url": "https://files.pythonhosted.org/packages/6c/01/4c27f71a20c6465643c422f3af93bcb20949b8e3f41fcb10e5c164c339bc/cert-issuer-2.0.18.tar.gz" } ], "2.0.19": [ { "comment_text": "", "digests": { "md5": "0032772c9087be0d578d7db05e65f633", "sha256": "2e695602fc0e4a02ab5a13a982b66473d93b365a3906b01a5678d05a995463ff" }, "downloads": -1, "filename": "cert_issuer-2.0.19-py3.7.egg", "has_sig": false, "md5_digest": "0032772c9087be0d578d7db05e65f633", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": null, "size": 91344, "upload_time": "2019-09-19T20:32:02", "url": "https://files.pythonhosted.org/packages/01/4a/cfa5da169824be09a666b58a35e8c8006b136abba0da95e92fd5867e4ecb/cert_issuer-2.0.19-py3.7.egg" }, { "comment_text": "", "digests": { "md5": "3590ae383c4479089e141f281b4af0f0", "sha256": "bb15fee01a029a80663e118145e3329d262f1bd77a42eb5a8ea7aa6e62640c2c" }, "downloads": -1, "filename": "cert-issuer-2.0.19.tar.gz", "has_sig": false, "md5_digest": "3590ae383c4479089e141f281b4af0f0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39384, "upload_time": "2019-09-19T20:32:00", "url": "https://files.pythonhosted.org/packages/1b/0b/a0c223a42dba85effd25d27e58c15e43dae552c03f7b7c835783a43c966d/cert-issuer-2.0.19.tar.gz" } ], "2.0.2": [ { "comment_text": "", "digests": { "md5": "17de6bb965e3eb8016b42f8477769e79", "sha256": "4b4fd33fb73e0912592d380ef08936555a9cf2ae70e334d85a503cbc10cda728" }, "downloads": -1, "filename": "cert-issuer-2.0.2.tar.gz", "has_sig": false, "md5_digest": "17de6bb965e3eb8016b42f8477769e79", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23619, "upload_time": "2017-08-30T20:31:27", "url": "https://files.pythonhosted.org/packages/5d/c8/56d471bb3ca0b7717abfbafde750817c371dde542c145b3c6882ae339cc0/cert-issuer-2.0.2.tar.gz" } ], "2.0.20": [ { "comment_text": "", "digests": { "md5": "51578a3d5de9a49be32ad2f9e8570d32", "sha256": "766a09fb2b4f98e9d49af13c6ca3da16b1bd3ebb003fe9620e3ce2118e2e4e34" }, "downloads": -1, "filename": "cert_issuer-2.0.20-py3.7.egg", "has_sig": false, "md5_digest": "51578a3d5de9a49be32ad2f9e8570d32", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": null, "size": 92121, "upload_time": "2019-10-07T15:02:33", "url": "https://files.pythonhosted.org/packages/b7/96/4913acfecbb542065e398543c5c14d1063e36edfe9abfd43d133c01b74ed/cert_issuer-2.0.20-py3.7.egg" }, { "comment_text": "", "digests": { "md5": "d88fda69ae2d3277acc5e10493c50540", "sha256": "16a89841f82cdba534491049abc1eaeebe340f4b38a2800f287cdd2f95473975" }, "downloads": -1, "filename": "cert-issuer-2.0.20.tar.gz", "has_sig": false, "md5_digest": "d88fda69ae2d3277acc5e10493c50540", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39611, "upload_time": "2019-10-07T15:02:30", "url": "https://files.pythonhosted.org/packages/9b/ab/01933f7b78e40c46fae764ebd2e6e7113b2632c88e92c3c8126b28cb957f/cert-issuer-2.0.20.tar.gz" } ], "2.0.3": [ { "comment_text": "", "digests": { "md5": "545838f62867ef23eeb93af2da84eb62", "sha256": "72d31bc5c8da62ecd689d169f85ba1b5aa90875e390cb332b4cb0b7526fe4caa" }, "downloads": -1, "filename": "cert-issuer-2.0.3.tar.gz", "has_sig": false, "md5_digest": "545838f62867ef23eeb93af2da84eb62", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23623, "upload_time": "2017-08-30T20:39:48", "url": "https://files.pythonhosted.org/packages/5c/ee/f05e6acc67732ef894545152c6eea5f55716aa9140bbe208471522119226/cert-issuer-2.0.3.tar.gz" } ], "2.0.4": [ { "comment_text": "", "digests": { "md5": "7d728d13664e03f5f93fc5e99ee1b45c", "sha256": "51016a9e274efb5408380a1c8b1d26c94130bb6ae6e931011c575744530c1b9b" }, "downloads": -1, "filename": "cert-issuer-2.0.4.tar.gz", "has_sig": false, "md5_digest": "7d728d13664e03f5f93fc5e99ee1b45c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23605, "upload_time": "2017-08-30T22:02:26", "url": "https://files.pythonhosted.org/packages/cd/1b/3d5f4d005b6142e69df7b73332c925dfbbc3c8d9eb5156bc3424def357e8/cert-issuer-2.0.4.tar.gz" } ], "2.0.5": [ { "comment_text": "", "digests": { "md5": "0d61b8a5c5ead66c10a6d26a01c12dff", "sha256": "cc667d794e5f171917b2571971f691d447cf1c9758950dba101ee64605aad0f8" }, "downloads": -1, "filename": "cert-issuer-2.0.5.tar.gz", "has_sig": false, "md5_digest": "0d61b8a5c5ead66c10a6d26a01c12dff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23631, "upload_time": "2017-08-30T22:11:39", "url": "https://files.pythonhosted.org/packages/87/41/f85504653caaa9302e95dc44a38409f13d44993116cd5d7fd92d5529ee6e/cert-issuer-2.0.5.tar.gz" } ], "2.0.6": [ { "comment_text": "", "digests": { "md5": "1872c2e852082e9db64ceab9a142ee5a", "sha256": "061e1b61435933048c4306359cd1ccaea20d4926ffe726410021c4efc710e755" }, "downloads": -1, "filename": "cert-issuer-2.0.6.tar.gz", "has_sig": false, "md5_digest": "1872c2e852082e9db64ceab9a142ee5a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23529, "upload_time": "2017-08-31T02:34:13", "url": "https://files.pythonhosted.org/packages/e0/73/a05f0c083ff5cf9d410d37b4dc21a68c4de7f04d2c8fdb813f09ac585816/cert-issuer-2.0.6.tar.gz" } ], "2.0.7": [ { "comment_text": "", "digests": { "md5": "9c912497dc45d1584df8aebc3dcdf8f9", "sha256": "210aa5c0ee95abc0c8b1a9869f0dab0a8661a77ec808e8745634f3f166a7d1cc" }, "downloads": -1, "filename": "cert-issuer-2.0.7.tar.gz", "has_sig": false, "md5_digest": "9c912497dc45d1584df8aebc3dcdf8f9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23441, "upload_time": "2017-08-31T22:56:27", "url": "https://files.pythonhosted.org/packages/d1/69/daa032877f7f547f58dc4a009fc90e1bed11e43a673d4465a088ec65c6f2/cert-issuer-2.0.7.tar.gz" } ], "2.0.8": [ { "comment_text": "", "digests": { "md5": "cc43842c781d8fc07179d20e7548252a", "sha256": "590e8cffbae6ec8dcd926e4534d666515a6d23662257a388cb41b23ed3c7f986" }, "downloads": -1, "filename": "cert-issuer-2.0.8.tar.gz", "has_sig": false, "md5_digest": "cc43842c781d8fc07179d20e7548252a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23417, "upload_time": "2017-09-02T17:19:30", "url": "https://files.pythonhosted.org/packages/b4/21/0d1ef14e7446ecaab4c1afcb5c0b3541e0e3275807150aded0b078519755/cert-issuer-2.0.8.tar.gz" } ], "2.0.9": [ { "comment_text": "", "digests": { "md5": "0968f8cb34328b3dc5b86f605653cefc", "sha256": "dc54524a0ef818c6dc7bbe63c92b2c28ea5e10c84cec2ea12b442baf6521bd7a" }, "downloads": -1, "filename": "cert-issuer-2.0.9.tar.gz", "has_sig": false, "md5_digest": "0968f8cb34328b3dc5b86f605653cefc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23529, "upload_time": "2017-09-13T19:51:03", "url": "https://files.pythonhosted.org/packages/56/ac/83e5c30fd77502bab9f250efc3ffe8e26a65ba5dbda9a04473a1afd3be41/cert-issuer-2.0.9.tar.gz" } ], "2.0b10": [ { "comment_text": "", "digests": { "md5": "7934f6a0162fd3bfc868402d2ba45cbe", "sha256": "0ecf7ab8d73cc27049a38da6f22fd6a3ef86cf9b52685926165154753192e886" }, "downloads": -1, "filename": "cert-issuer-2.0b10.tar.gz", "has_sig": false, "md5_digest": "7934f6a0162fd3bfc868402d2ba45cbe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21221, "upload_time": "2017-06-05T18:04:44", "url": "https://files.pythonhosted.org/packages/81/8d/6597a59262072a628768f792667b097de61c08fde29b38b90b5c19d73191/cert-issuer-2.0b10.tar.gz" } ], "2.0b11": [ { "comment_text": "", "digests": { "md5": "cd06b2e43b2bca1bd699d22d6b089dbf", "sha256": "e163ef57f36e28ec66c6c81d18ed652d6bb14781fe621bb02463e15dc0c8c495" }, "downloads": -1, "filename": "cert-issuer-2.0b11.tar.gz", "has_sig": false, "md5_digest": "cd06b2e43b2bca1bd699d22d6b089dbf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21260, "upload_time": "2017-06-19T16:43:28", "url": "https://files.pythonhosted.org/packages/79/b8/e78484f7321d546aa1dab30279058f631688ce0f1737b3890fa21c9369bd/cert-issuer-2.0b11.tar.gz" } ], "2.0b12": [ { "comment_text": "", "digests": { "md5": "de52eb772f4f4b84c32c48b7bafac73d", "sha256": "368406ae9af80c26f01ed4b3fa1db2ee1d6174923ad9bf4b87d9ed280619ae87" }, "downloads": -1, "filename": "cert-issuer-2.0b12.tar.gz", "has_sig": false, "md5_digest": "de52eb772f4f4b84c32c48b7bafac73d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21265, "upload_time": "2017-06-19T17:11:00", "url": "https://files.pythonhosted.org/packages/fa/10/e32d2e0cfacdea55f6472f686c2b6f065b42f839f42bacde01e65297cd4b/cert-issuer-2.0b12.tar.gz" } ], "2.0b13": [ { "comment_text": "", "digests": { "md5": "3ba7cb5821fe37b6260427bcfbbef693", "sha256": "4e38b43f453e8fbd3297fdd11461ba8756b4cfe88d418b2c095982c1ca211ee3" }, "downloads": -1, "filename": "cert-issuer-2.0b13.tar.gz", "has_sig": false, "md5_digest": "3ba7cb5821fe37b6260427bcfbbef693", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21272, "upload_time": "2017-06-19T20:24:20", "url": "https://files.pythonhosted.org/packages/2d/58/b9df85b5a8c08687688a287baf100c82a38fda993b01044e2e5c32dd57f2/cert-issuer-2.0b13.tar.gz" } ], "2.0b14": [ { "comment_text": "", "digests": { "md5": "a996027886c9c788d59d3a961912a30d", "sha256": "997d54d08c6ead2b0d56de7f0e0408c4e64f8dfd37b60697e18fb72e95afbe70" }, "downloads": -1, "filename": "cert-issuer-2.0b14.tar.gz", "has_sig": false, "md5_digest": "a996027886c9c788d59d3a961912a30d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21263, "upload_time": "2017-06-19T20:48:49", "url": "https://files.pythonhosted.org/packages/5b/13/e31655399b1ac80bd7282714e20ebbefe7751fac4950a2adedb69a8bd807/cert-issuer-2.0b14.tar.gz" } ], "2.0b15": [ { "comment_text": "", "digests": { "md5": "2e6d370cbd40a92030b01c000ae58826", "sha256": "50028ddabd00c94ec4c9e9216939a56838652898a7716979b309072c9f4d4ee0" }, "downloads": -1, "filename": "cert-issuer-2.0b15.tar.gz", "has_sig": false, "md5_digest": "2e6d370cbd40a92030b01c000ae58826", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21286, "upload_time": "2017-06-19T21:01:34", "url": "https://files.pythonhosted.org/packages/60/75/737b97e08f58fea14324d1dbdb1e1f555f184ccd505e668d7107d5e3a4bc/cert-issuer-2.0b15.tar.gz" } ], "2.0b16": [ { "comment_text": "", "digests": { "md5": "ede9dbc08a69c1b5105b90b8ad6d4c89", "sha256": "b4233514c4722082fc763559c99711e70be0bf2a37499aab8e357d310437e5ba" }, "downloads": -1, "filename": "cert-issuer-2.0b16.tar.gz", "has_sig": false, "md5_digest": "ede9dbc08a69c1b5105b90b8ad6d4c89", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21141, "upload_time": "2017-06-22T04:12:30", "url": "https://files.pythonhosted.org/packages/24/03/6ccbb45144f2d99c0cc72d4e4e772355ab84a6a5a33367448f7dff496bf0/cert-issuer-2.0b16.tar.gz" } ], "2.0b17": [ { "comment_text": "", "digests": { "md5": "6622036a89f5f4f91b49da5e6572f495", "sha256": "39303e2f2c8a76e4d501c03e4e915741e6733c9c46f1ba1c92b3eb35dd860785" }, "downloads": -1, "filename": "cert-issuer-2.0b17.tar.gz", "has_sig": false, "md5_digest": "6622036a89f5f4f91b49da5e6572f495", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21139, "upload_time": "2017-06-23T16:43:28", "url": "https://files.pythonhosted.org/packages/f8/4d/f51ae2d7c087af3bc387b41f312b2cf29e17646680743a9c0ae7d640d299/cert-issuer-2.0b17.tar.gz" } ], "2.0b18": [ { "comment_text": "", "digests": { "md5": "817e0a3d6a0a7305b3f92b3689701b98", "sha256": "1d13fe08055558f1345bca63f58b6c21d39eb47cbe52b970d0ad39ff31666be0" }, "downloads": -1, "filename": "cert-issuer-2.0b18.tar.gz", "has_sig": false, "md5_digest": "817e0a3d6a0a7305b3f92b3689701b98", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21136, "upload_time": "2017-06-23T19:30:54", "url": "https://files.pythonhosted.org/packages/e7/16/013254a4e03ebd2cb61618cf27d03c2f342dc41b6426761812ed0cd319f9/cert-issuer-2.0b18.tar.gz" } ], "2.0b3": [ { "comment_text": "", "digests": { "md5": "559f7e2defb27441d27a7c8fddb95b4a", "sha256": "b38e33e04df6a5d156611745286b03f14148775a6011c7db1d7abb40ba187200" }, "downloads": -1, "filename": "cert-issuer-2.0b3.tar.gz", "has_sig": false, "md5_digest": "559f7e2defb27441d27a7c8fddb95b4a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21334, "upload_time": "2017-04-26T20:06:45", "url": "https://files.pythonhosted.org/packages/9e/33/766ea85ac7c03be61ba47b09f8cf47546ca7208b986c03dc53808190e167/cert-issuer-2.0b3.tar.gz" } ], "2.0b4": [ { "comment_text": "", "digests": { "md5": "66581836df4cd198b38cbdf90f5f623f", "sha256": "c5cbe176f7e1ee2d9f45bee184d32855c3b2a967c95382a7a338d07ae47fa918" }, "downloads": -1, "filename": "cert-issuer-2.0b4.tar.gz", "has_sig": false, "md5_digest": "66581836df4cd198b38cbdf90f5f623f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21333, "upload_time": "2017-05-01T20:14:27", "url": "https://files.pythonhosted.org/packages/fc/22/d13cd427216ef2f3c6d61fe4fe3135ed5d797e94817facf906464203e35c/cert-issuer-2.0b4.tar.gz" } ], "2.0b5": [ { "comment_text": "", "digests": { "md5": "3fdeeedc17d1e81d936250d346916fbe", "sha256": "7ca887d915867b9c5e513ef08432741a3118e3955161dcb6d9920ef5bf83ef6a" }, "downloads": -1, "filename": "cert-issuer-2.0b5.tar.gz", "has_sig": false, "md5_digest": "3fdeeedc17d1e81d936250d346916fbe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21330, "upload_time": "2017-05-05T18:16:22", "url": "https://files.pythonhosted.org/packages/b5/22/6ec4131660b483036312b90ee25338401e2a9dccb0764e3339e82d2ffe2c/cert-issuer-2.0b5.tar.gz" } ], "2.0b6": [ { "comment_text": "", "digests": { "md5": "8e5ed3f74444f96438f0cdb573205050", "sha256": "de258d78ca10179b43cda90759c56abd88d8d0ca86bda335339dce47e3bd32b6" }, "downloads": -1, "filename": "cert-issuer-2.0b6.tar.gz", "has_sig": false, "md5_digest": "8e5ed3f74444f96438f0cdb573205050", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21339, "upload_time": "2017-05-13T06:06:28", "url": "https://files.pythonhosted.org/packages/e2/a4/3da455953d0eb00909e7d644c723438b455d8c0dfc11b7f0453e34aaef01/cert-issuer-2.0b6.tar.gz" } ], "2.0b7": [ { "comment_text": "", "digests": { "md5": "b16e6d3c031338256a347e1c20206dac", "sha256": "654c26589d3b3bf8143cc2ad0d645418894ea1765ded7e015409a7047dd73b54" }, "downloads": -1, "filename": "cert-issuer-2.0b7.tar.gz", "has_sig": false, "md5_digest": "b16e6d3c031338256a347e1c20206dac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21022, "upload_time": "2017-05-22T23:52:07", "url": "https://files.pythonhosted.org/packages/0e/a8/e72afc98d6ecce4849d32783d34afc4d06870d3fc31259dc6457906f18bf/cert-issuer-2.0b7.tar.gz" } ], "2.0b8": [ { "comment_text": "", "digests": { "md5": "6bd5b50dc20881a3498f37c5a2df7325", "sha256": "71a5a3c412165b29ca6157fe7c9e1a84713dbd790ac746bf5f78264b908b6097" }, "downloads": -1, "filename": "cert-issuer-2.0b8.tar.gz", "has_sig": false, "md5_digest": "6bd5b50dc20881a3498f37c5a2df7325", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21071, "upload_time": "2017-06-05T16:38:54", "url": "https://files.pythonhosted.org/packages/c4/e5/8db6b8fd4397cd5315131887311304c97e7ad07442c7344938bd46c12367/cert-issuer-2.0b8.tar.gz" } ], "2.0b9": [ { "comment_text": "", "digests": { "md5": "9c39fdd8d6ccde32af12470edb850cff", "sha256": "a36d93d55a3b9bba7eb689d1b71404984358a8b2b3df11c60be8af7f2d4676e3" }, "downloads": -1, "filename": "cert-issuer-2.0b9.tar.gz", "has_sig": false, "md5_digest": "9c39fdd8d6ccde32af12470edb850cff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21221, "upload_time": "2017-06-05T17:53:37", "url": "https://files.pythonhosted.org/packages/e0/20/f9a809cc75553a3f58a9d41952a6bee90626875cc9d4913a4bf2eb39f180/cert-issuer-2.0b9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "51578a3d5de9a49be32ad2f9e8570d32", "sha256": "766a09fb2b4f98e9d49af13c6ca3da16b1bd3ebb003fe9620e3ce2118e2e4e34" }, "downloads": -1, "filename": "cert_issuer-2.0.20-py3.7.egg", "has_sig": false, "md5_digest": "51578a3d5de9a49be32ad2f9e8570d32", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": null, "size": 92121, "upload_time": "2019-10-07T15:02:33", "url": "https://files.pythonhosted.org/packages/b7/96/4913acfecbb542065e398543c5c14d1063e36edfe9abfd43d133c01b74ed/cert_issuer-2.0.20-py3.7.egg" }, { "comment_text": "", "digests": { "md5": "d88fda69ae2d3277acc5e10493c50540", "sha256": "16a89841f82cdba534491049abc1eaeebe340f4b38a2800f287cdd2f95473975" }, "downloads": -1, "filename": "cert-issuer-2.0.20.tar.gz", "has_sig": false, "md5_digest": "d88fda69ae2d3277acc5e10493c50540", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39611, "upload_time": "2019-10-07T15:02:30", "url": "https://files.pythonhosted.org/packages/9b/ab/01933f7b78e40c46fae764ebd2e6e7113b2632c88e92c3c8126b28cb957f/cert-issuer-2.0.20.tar.gz" } ] }