{"action":"opened","number":1,"pull_request":{"url":"https://api.github.com/repos/mmnc/PowerExtend/pulls/1","id":61815133,"html_url":"https://github.com/mmnc/PowerExtend/pull/1","diff_url":"https://github.com/mmnc/PowerExtend/pull/1.diff","patch_url":"https://github.com/mmnc/PowerExtend/pull/1.patch","issue_url":"https://api.github.com/repos/mmnc/PowerExtend/issues/1","number":1,"state":"open","locked":false,"title":"About power extend certificate","user":{"login":"SilviaHyde","id":2263328,"avatar_url":"https://avatars.githubusercontent.com/u/2263328?v=3","gravatar_id":"","url":"https://api.github.com/users/SilviaHyde","html_url":"https://github.com/SilviaHyde","followers_url":"https://api.github.com/users/SilviaHyde/followers","following_url":"https://api.github.com/users/SilviaHyde/following{/other_user}","gists_url":"https://api.github.com/users/SilviaHyde/gists{/gist_id}","starred_url":"https://api.github.com/users/SilviaHyde/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SilviaHyde/subscriptions","organizations_url":"https://api.github.com/users/SilviaHyde/orgs","repos_url":"https://api.github.com/users/SilviaHyde/repos","events_url":"https://api.github.com/users/SilviaHyde/events{/privacy}","received_events_url":"https://api.github.com/users/SilviaHyde/received_events","type":"User","site_admin":false},"body":"What is a certificate\r\n=====================\r\n\r\nA certificate is like an identity card for the digital world. If properly implemented,\r\n it can be very useful in ensuring that a piece of data comes from a certain author.\r\n\r\nHow it works\r\n------------\r\n\r\nThe whole infrastructure sits on top of asymmetric encryption:\r\n\r\nSay John encrypts his message with a password. Jane must know the password in order to decrypt\r\n John's message. This is bad because John must then tell Jane his password somehow.\r\n\r\nComes asymmetric encryption: John can encrypt his message with password `'A'`. Jane decrypts\r\n the message with password `'B'`. The maths behind ensures that there is only one `'A'` to `'B'`\r\n  and vice verse. Also, Jane won't be able to work out what `'A'` is by knowing `'B'` and the\r\n   message (encrypted or otherwise).\r\n\r\nThis helpful property in asymmetric encryption can be used for digital signing. Here's how it works:\r\n\r\n1. John encrypts the work `'banana'` with password `'A'`. The result is `b83nbl1=`\r\n2. John writes on a bulletin board: my public password is `'B'`. If you use that\r\n password to decrypt `'b83nbl1='`, you will get back `'banana'`\r\n3. Jane saw the post and ran the maths. Sure enough, John's words were true. Since there is only one pair of `'A'` and `'B'`, John must know password `'A'` in order to encrypt the message. Assuming that nobody else knows password `'A'`, she knows that the poster must be John.\r\n\r\n\r\nHow is this related to certificates\r\n-----------------------------------\r\n\r\nCertificates are all about signing. You begin by trusting a **root certificate authority (CA)**. You got to trust someone right?. To do that, you save that CA's name and password `'B'` on your computer.\r\n\r\nNow a requestor (we call a 'subject') will ask the CA (the 'issuer') to sign a message (the 'certificate'). In essense, the message says who the subject is, and what purpose was the certificate for (e.g. be the SSL certificate for a website). The issuer will (after getting paid, of course) sign the message and return it to the subject.\r\n\r\n\r\n-----------------------------------------------------------------------------------------------\r\n\r\n\r\nFields in a certificate\r\n=======================\r\n\r\nThere are many fields in a certificate. We can put them into 3 broad categories:\r\n\r\n* Name\r\n* Capability\r\n* Specification\r\n\r\nName\r\n----\r\n\r\nThis is mainly about the issuer and the subject (recipient of the certificate).\r\n\r\nThink about your college degree: it is issued by your school (the issuer) to you (subject). In each case, there are a lot of information that can be said.\r\n\r\nUse the **`New-CertificateName`** command to create a naming object.\r\n\r\nNote that certain fields can only support a single value (such as your DNS name, like `'www.fabrikom.com'`). This creates a problem when you want a certificate that can work for many domains (e.g. `'www.fabrikom.com'`, `'mail.fabrikom.com'`). You can use an alternate name in this case (SAN).\r\n\r\nMost if not all commercial certification authorities charge a lot extra for SAN names. So as to encourage you to buy more individual certificates from them?\r\n\r\n\r\nCapability\r\n----------\r\n\r\nHere we are concerned with the purpose of the certificate.\r\n\r\nThe easiest way is to create an all-capable certificate (if there is such a thing). However, conventional wisdom dictates that we create separate certificates for different purposes, so that you don't 'lose it all' when a private key gets stolen.\r\n\r\nThe **`Add-CertificateCapability`** command offers templates for different purpose certificates. You can also create custom capabilities too.\r\n\r\nCommercial certificates are sold on a per-purpose basis. For instance, website SSL certificates are charged less than code signing certificates. Is it because there are less codesign than webmasters customers? Kind of weird when running an executable is more risky than visiting a website.\r\n\r\n\r\nSpecification\r\n-------------\r\n\r\nThe last part is all about the maths. What cryptographic engine to use? What algorithm? How long should the keys be?\r\n\r\n\r\n---------------------------------------------------------------------------------------------\r\n\r\n\r\nCreating a self-signed certificate\r\n==================================\r\n\r\nThis is a special case where the issuer is the subject.\r\n\r\nAll root CA are self-signed certificates. It's like a self-proclaimed king. Since these companies are 'well-established', browsers and Windows install them onto your system by default. They then start issuing more certificates to those who must pay.\r\n\r\nThe truth is anyone can create a self-signed certificate. To try, check out the **`New-RootCertificate`** command.\r\n\r\nOf course, your certificate is not included by major browsers and operating systems by default. So people will need to install your certificate in order for things to work.\r\n\r\n\r\n----------------------------------------------------------------------------------------------\r\n\r\n\r\nThe whole certificate creation workflow\r\n=======================================\r\n\r\nWe're going to build a certificate hirarchy:\r\n\r\n[-]-- TestCo Root CA\r\n      |--[-] TestCo Intermediate CA\r\n             |-[-] TestCo CodeSign\r\n             |-[-] TestCo.com\r\n             |-[-] john@testco.com\r\n\r\n\r\nAll these makes more sense if you fire up certificate manager (run > certmgr.msc).\r\n\r\n* TestCo Root CA will live in the 'Trusted Root Certificate Authority' store. Just for being lazy, we won't restrict what it can do.\r\n  It is a self-signed certificate, which means the issuer and subject are the same person (the self-proclaimed king).\r\n\r\n* TestCo Intermediate CA will live in the 'Intermediate Certificate Authority' store.\r\n  This certificate is requested by 'TestCo Intermediate CA', and approved by 'TestCo Root CA'. We're going to make it a little more restrictive in what it can do.\r\n\r\n* TestCo CodeSign is issued for the purpose of code signing only. It is issued by 'TestCo Intermediate CA'.\r\n  TestCo CodeSign will not be issue any more certificates down the line. It is an 'end-entity'.\r\n\r\n* TestCo.com is a SSL certificate will be installed on a webserver. It is issued by 'TestCo Intermediate CA'.\r\n  TestCo.com is also an 'end-entity'.\r\n\r\n* john@testco.com is issued to John for him to encrypt documents and proving his identity online. It is issued by 'TestCo Intermediate CA'.\r\n  It is an 'end-entity' too.\r\n\r\nThe whole tree structure makes sense if you ever lose the private key to 'TestCo Intermediate CA'. 'TestCo Root CA' can then sign a message that says 'TestCo Intermediate CA' has been stolen. This is called revocation.\r\n\r\n---------------------------------------------\r\n\r\n# TestCo Root CA\r\n\r\nLet's start by creating a self-signed certificate:\r\n\r\n[Code]\r\n$passwd = ConvertTo-SecureString -String 'casecret' -AsPlainText -Force\r\n$issuer = New-CertificateName -CommonName 'TestCo Root CA' -FriendlyName 'TestCo Root' -Company 'TestCo Inc.' -Department @('(c) 2008 TestCo Inc. - For authorized use only', 'TestCo Trust Network') -Locality 'Cape Town' -State 'Western Cape' -Street 'Birch Ave' -Country ZA -PolicyUrl @('http://cert.testco.com/policy', 'http://cert.testco.com/intermediate') -PolicyStatement 'Limited liability. Read the *Legal Limitations* section of the TestCo Certification Authority Policy available at http://cert.testco.com/policy'\r\n$caCapability = Add-CertificateCapability -Capability Template -Purpose RootCA\r\nNew-RootCertificate -OutFile .\\testroot.pfx -Name $issuer -Capability $caCapability -Password $passwd -Verbose\r\n$pfx = Import-Certificate -Path .\\testroot.pfx -Password $passwd -KeyStorageFlags Exportable\r\n$pfx | ConvertFrom-PfxCertificate -OutFile testroot.crt -OutputFormat PEM\r\nInstall-Certificate -Path .\\testroot.crt -StoreLocation CurrentUser -StoreName Root -Exportable -Password $passwd\r\n[/Code]\r\n\r\nDescription\r\n-----------\r\nFirst we create a password to protect our certificate. My password is 'secret'. I store in a variable called '$passwd'.\r\n\r\nNext we create an object to hold the subject information. There are a lot of fields, but the 'CommonName' field is essential. The variable to hold subject information is called '$issuer'.\r\n\r\nThen we make the certificate authority (CA) certificate using the 'New-RootCertificate' command. Remember that a self-signed root certificate means the issuer and subject are the same person, so there is only one 'Name' parameter. Also note that I'm creating an all-purpose certificate, but you'll probably want to further restrict its capability in real life.\r\n\r\nThe command outputs a certificate file 'testroot.pfx'. Note that the private key is embeded in the PFX certificate file, and is protected by the password I first set. So keep the PFX file real safe!\r\n\r\nAt this point, you can click on the 'testroot.pfx' file in Windows Explorer and import it, but let's be hardcore and do it all from the command line.\r\n\r\nI start off by importing my CA certificate back from the file 'testroot.pfx', storing it in a variable called $pfx. Next, I use the 'ConvertFrom-PfxCertificate' command to export the certificate as a file again. This time it is in the PEM format, and I did not export the private key.\r\n\r\nTo install the CA certificate, use the 'Install-Certificate' command. You do not want to distribute your PFX file, since it contains your private key. Instead, distribute the file 'testroot.crt'.\r\n\r\nI'm installing the certificate for myself only. If you want to install the certificate for all users on the PC, you'll need to use the 'LocalMachine' store and run things from an elevated terminal.\r\n\r\n---------------------------------------------\r\n\r\n# TestCo Intermediate CA: request\r\n\r\nSo we're now a self-proclaimed king. Let's create a subordinate certificate!\r\n\r\n[Code]\r\n$subca = New-CertificateName -CommonName 'TestCo Intermediate CA' -FriendlyName 'TestCo Intermediate' -Company 'TestCo Inc.' -Department @('(c) 2008 TestCo Inc. - For authorized use only', 'TestCo Trust Network') -Locality 'Cape Town' -State 'Western Cape' -Street 'Birch Ave' -Country ZA -PolicyUrl @('http://cert.testco.com/policy', 'http://cert.testco.com/intermediate') -PolicyStatement 'Limited liability. Read the *Legal Limitations* section of the TestCo Certification Authority Policy available at http://cert.testco.com/policy'\r\n$subcaCapability = Add-CertificateCapability -Capability Template -Purpose CommonCA\r\n$priv = New-CertificatePrivateKey\r\nExport-CertificatePrivateKey -PrivateKey $priv -OutFile .\\testsubca.key\r\n$request = New-CertificateRequest -Name $subca -Issuer $issuer -PrivateKey $priv -Capability $subcaCapability\r\n$request | Export-CertificateRequest -OutFile .\\testsubca.req -Encoding Base64Request\r\n$priv.Delete()\r\n[/Code]\r\n\r\nDescription\r\n-----------\r\nFirst we create the subject. I made sure that it is a different name from the issuer.\r\n\r\nThen we build the certificate capability in a variable called '$subcaCapability'.\r\n\r\nCreating a private key is easily done with the 'New-CertificatePrivateKey' command. I go further to export the key to a file. Keep it safe!\r\n\r\nTime to make the certificate request. To do that, use the 'New-CertificateRequest' command. Feed in the subject, issuer, and capability, plus a few extras. Note that your private key is used to sign the certificate request, but is not embedded in the request itself. Therefore, anyone who gets the request certificate file will not know your private key.\r\n\r\nI now export the request to a certificate file 'testsubca.req'. This file is already a certificate (abit unsigned by the issuer). If you change the extension to '.crt', you can open it up with Windows Explorer.\r\n\r\nThe last statement '$priv.Delete()' deletes the private key from memory. That made me feel so safe.\r\n\r\nNow let's image me passing that file to a certificate authority through email.\r\n\r\n---------------------------------------------\r\n\r\n# TestCo Intermediate CA: approve\r\n\r\nLet me be the certificate authority now. I have received the request file 'testsubca.req' and needs to approve it.\r\n\r\n[Code]\r\n$request = Import-CertificateRequest -FilePath .\\testsubca.req -Encoding Base64Request\r\n$signCert = Import-Certificate -Path .\\testroot.pfx -Password (ConvertTo-SecureString -String 'casecret' -AsPlainText -Force)\r\n$approvedRequest = Approve-CertificateRequest -Signer $signCert -Request $request\r\n$approvedRequest | Export-CertificateRequest .\\testsubca.crt -Encoding Base64Cert -Force\r\n[/Code]\r\n\r\nDescription\r\n-----------\r\nWe read in the certificate request file in a variable called '$request'.\r\n\r\nI now approve of the request by signing it with my self-signed certificate authority certificate ('testroot.pfx'). First I have to import it in. I store my certificate in a variable called '$signCert'.\r\n\r\nSigning is done with the 'Approve-CertificateRequest' command. Plug in the request and signer certificates and we're done.\r\n\r\nThe last line exports the approved certificate to a file ('testsubca.crt'). At this point the subordinate certificate is signed and valid. Open it up on Windows Explorer and see what I mean!\r\n\r\nI now ships it back to the requesting subject.\r\n\r\n---------------------------------------------\r\n\r\n# TestCo Intermediate CA: install\r\n\r\nNow back to the subject. I have received the approved certificate file ('testsubca.crt').\r\n\r\n[Code]\r\n$passwd = ConvertTo-SecureString -String 'subcasecret' -AsPlainText -Force\r\nConvertTo-PfxCertificate -CertFilePath .\\testsubca.crt -PrivateKeyFilePath .\\testsubca.key -PrivateKeyPassword $passwd -OutFile .\\testsubca.pfx -Password $passwd\r\nInstall-Certificate -Path .\\testsubca.pfx -StoreLocation CurrentUser -StoreName CertificateAuthority -Password $passwd\r\n[/Code]\r\n\r\nPretty simple. Merge the approved certificate and your private key into a PFX file ('testsubca.pfx'). Then install onto your 'Intermediate Certificate Authorities' store.\r\n\r\nNote that this time I have imported the certificate into the store with the private key. You can see the result by firing up certmgr.msc > Personal > Certificates.\r\n\r\nAlso I have used a new password 'subcasecret' for this intermediate CA. Another layer of safety!\r\n\r\n----------------------------------------------\r\n\r\n# End entities\r\n\r\n[Code]\r\n$entities = @(\r\n    @{\r\n        'Name' = New-CertificateName -CommonName 'TestCo Software' -FriendlyName 'TestCo Software' -Company 'TestCo Inc.' -Locality 'Cape Town' -State 'Western Cape' -Street 'Birch Ave' -Country ZA -AlternateEmail 'software@testco.com' -AlternateUPN 'software@testco.com'\r\n        'Capability' = Add-CertificateCapability -Capability Template -Purpose CodeSign\r\n        'FileName' = 'testcoder'\r\n        'Store' = 'My'\r\n        'Password' = 'codersecret'\r\n    },\r\n    @{\r\n        'Name' = New-CertificateName -CommonName 'www.testco.com' -FriendlyName 'TestCo Web' -Email 'postmaster@testco.com' -Company 'TestCo Inc.' -Locality 'Cape Town' -State 'Western Cape' -Street 'Birch Ave' -Country ZA -AlternateDNS @('www.testco.com', 'testco.com')\r\n        'Capability' = Add-CertificateCapability -Capability Template -Purpose WebServer\r\n        'FileName' = 'testweb'\r\n        'Store' = 'My'\r\n        'Password' = 'websecret'\r\n    },\r\n    @{\r\n        'Name' = New-CertificateName -CommonName 'john@testco.com' -FriendlyName 'John Smith' -GivenName John -Initials JS -SurName Smith -Title Mr. -Company 'TestCo Inc.' -Locality 'Cape Town' -State 'Western Cape' -Street 'Birch Ave' -Country ZA -AlternateEmail 'john@testco.com' -AlternateUPN 'software@testco.com'\r\n        'Capability' = Add-CertificateCapability -Capability Template -Purpose User\r\n        'FileName' = 'testuser'\r\n        'Store' = 'My'\r\n        'Password' = 'usersecret'\r\n    }\r\n)\r\n$subca = New-CertificateName -CommonName 'TestCo Intermediate CA' -FriendlyName 'TestCo Intermediate' -Company 'TestCo Inc.' -Department @('(c) 2008 TestCo Inc. - For authorized use only', 'TestCo Trust Network') -Locality 'Cape Town' -State 'Western Cape' -Street 'Birch Ave' -Country ZA -PolicyUrl @('http://cert.testco.com/policy', 'http://cert.testco.com/intermediate') -PolicyStatement 'Limited liability. Read the *Legal Limitations* section of the TestCo Certification Authority Policy available at http://cert.testco.com/policy'\r\n$signCert = Import-Certificate -Path .\\testsubca.pfx -Password (ConvertTo-SecureString -String 'subcasecret' -AsPlainText -Force)\r\n$entities | ForEach-Object {\r\n    $priv = New-CertificatePrivateKey\r\n    Export-CertificatePrivateKey -PrivateKey $priv -OutFile \"$($_.FileName).key\"\r\n    $request = New-CertificateRequest -Name $_.Name -Issuer $subca -PrivateKey $priv -Capability $_.Capability -AlternativeName\r\n    $request | Export-CertificateRequest -OutFile \"$($_.FileName).req\" -Encoding Base64Request\r\n    $approvedRequest = Approve-CertificateRequest -Signer $signCert -Request $request\r\n    $approvedRequest | Export-CertificateRequest -OutFile \"$($_.FileName).crt\" -Encoding Base64Cert\r\n    $passwd = ConvertTo-SecureString -String $_.Password -AsPlainText -Force\r\n    ConvertTo-PfxCertificate -CertFilePath \"$($_.FileName).crt\" -PrivateKeyFilePath \"$($_.FileName).key\" -PrivateKeyPassword $passwd -OutFile \"$($_.FileName).pfx\" -Password $passwd\r\n    Install-Certificate -Path \"$($_.FileName).pfx\" -StoreLocation CurrentUser -StoreName $_.Store -Password $passwd \r\n    $priv.Delete()\r\n    Write-Host '----------[ done ]----------' -ForegroundColor Blue\r\n}\r\n[/Code]\r\n\r\nThis script will create all three end entity certificates for different uses. The first one is a code signing certificate, which can be used to sign executable files and PowerShell scripts.\r\n\r\nThe second one can be installed on a web server. Then you get SSL capabilities (the 'https://' thing).\r\n\r\nThe last one is a personal certificate. You can encode things with it and protect your emails.\r\n\r\nThen script generates a bunch of files. Be sure to secure your .key and .pfx files.\r\n\r\nAfter you have ran the script, you can see all the certificate in the My store (certmgr.msc).\r\n\r\n==================================\r\n\r\n# Profit 1\r\n\r\nI'll not be showing you how to use the web server certificate. Check out the server software documentation for more info.\r\n\r\nWhat I'll show you first is how to protect your messages.\r\n\r\n[Code]\r\n$cert = dir Cert:\\CurrentUser\\My | Where { $_.Subject.Contains('CN=john@testco.com') }\r\nProtect-String -String 'mysecret' -Certificate $cert | Unprotect-String -Certificate $cert\r\n[/Code]\r\n\r\nYou should get back 'mysecret'. This technique can be used to secure your messages with friends:\r\n\r\n[Code]\r\n# you give your friend your .crt file. Then he'll type in:\r\n$pubcert = Import-Certificate -Path .\\testuser.crt\r\nProtect-String -String 'mysecret' -Certificate $pubcert | Set-Content -Path .\\secretmsg.txt\r\n# then he pass the output file 'secretmsg.txt' to you.\r\n# from your end:\r\n$cert = dir Cert:\\CurrentUser\\My | Where { $_.Subject.Contains('CN=john@testco.com') }\r\nGet-Content .\\secretmsg.txt -Encoding Ascii | Unprotect-String -Certificate $cert\r\n[/Code]\r\n\r\nOf course, asymmetric encryption can't keep up the pace when your data gets too big. To solve that problem, you use regular encryption techniques to protect your data with a password, then encrypt your password with a certificate. The 'Protect-File' command does just that internally.\r\n\r\n----------------------------------------------\r\n\r\n# Profit 2\r\n\r\nExecutable files can also be signed. It doesn't protect you like an antivirus program per se, but gives some assurance as to the author of the file.\r\n\r\nTo test, let's make a powershell script 'tester.ps1'. Just write any dummy code, like 'Write-Host hello'\r\n\r\n[Code]\r\n$cert = dir Cert:\\CurrentUser\\My -CodeSigningCert\r\nSet-AuthenticodeSignature -Certificate $cert -FilePath .\\tester.ps1\r\n[/Code]\r\n\r\nIf you right click on the file in Windows Explorer, you can now see the digital signature tab.\r\n\r\nThe same goes for .exe/.dll files as well.\r\n","created_at":"2016-03-05T15:35:37Z","updated_at":"2016-03-05T15:35:37Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/mmnc/PowerExtend/pulls/1/commits","review_comments_url":"https://api.github.com/repos/mmnc/PowerExtend/pulls/1/comments","review_comment_url":"https://api.github.com/repos/mmnc/PowerExtend/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mmnc/PowerExtend/issues/1/comments","statuses_url":"https://api.github.com/repos/mmnc/PowerExtend/statuses/6fe2831b34661de452ad66bb9c804588ea6e4f82","head":{"label":"mmnc:about-PowerExtend-Certificate","ref":"about-PowerExtend-Certificate","sha":"6fe2831b34661de452ad66bb9c804588ea6e4f82","user":{"login":"mmnc","id":17543293,"avatar_url":"https://avatars.githubusercontent.com/u/17543293?v=3","gravatar_id":"","url":"https://api.github.com/users/mmnc","html_url":"https://github.com/mmnc","followers_url":"https://api.github.com/users/mmnc/followers","following_url":"https://api.github.com/users/mmnc/following{/other_user}","gists_url":"https://api.github.com/users/mmnc/gists{/gist_id}","starred_url":"https://api.github.com/users/mmnc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mmnc/subscriptions","organizations_url":"https://api.github.com/users/mmnc/orgs","repos_url":"https://api.github.com/users/mmnc/repos","events_url":"https://api.github.com/users/mmnc/events{/privacy}","received_events_url":"https://api.github.com/users/mmnc/received_events","type":"Organization","site_admin":false},"repo":{"id":53118631,"name":"PowerExtend","full_name":"mmnc/PowerExtend","owner":{"login":"mmnc","id":17543293,"avatar_url":"https://avatars.githubusercontent.com/u/17543293?v=3","gravatar_id":"","url":"https://api.github.com/users/mmnc","html_url":"https://github.com/mmnc","followers_url":"https://api.github.com/users/mmnc/followers","following_url":"https://api.github.com/users/mmnc/following{/other_user}","gists_url":"https://api.github.com/users/mmnc/gists{/gist_id}","starred_url":"https://api.github.com/users/mmnc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mmnc/subscriptions","organizations_url":"https://api.github.com/users/mmnc/orgs","repos_url":"https://api.github.com/users/mmnc/repos","events_url":"https://api.github.com/users/mmnc/events{/privacy}","received_events_url":"https://api.github.com/users/mmnc/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mmnc/PowerExtend","description":"Extension commands that makes Powershell more...powerful","fork":false,"url":"https://api.github.com/repos/mmnc/PowerExtend","forks_url":"https://api.github.com/repos/mmnc/PowerExtend/forks","keys_url":"https://api.github.com/repos/mmnc/PowerExtend/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mmnc/PowerExtend/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mmnc/PowerExtend/teams","hooks_url":"https://api.github.com/repos/mmnc/PowerExtend/hooks","issue_events_url":"https://api.github.com/repos/mmnc/PowerExtend/issues/events{/number}","events_url":"https://api.github.com/repos/mmnc/PowerExtend/events","assignees_url":"https://api.github.com/repos/mmnc/PowerExtend/assignees{/user}","branches_url":"https://api.github.com/repos/mmnc/PowerExtend/branches{/branch}","tags_url":"https://api.github.com/repos/mmnc/PowerExtend/tags","blobs_url":"https://api.github.com/repos/mmnc/PowerExtend/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mmnc/PowerExtend/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mmnc/PowerExtend/git/refs{/sha}","trees_url":"https://api.github.com/repos/mmnc/PowerExtend/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mmnc/PowerExtend/statuses/{sha}","languages_url":"https://api.github.com/repos/mmnc/PowerExtend/languages","stargazers_url":"https://api.github.com/repos/mmnc/PowerExtend/stargazers","contributors_url":"https://api.github.com/repos/mmnc/PowerExtend/contributors","subscribers_url":"https://api.github.com/repos/mmnc/PowerExtend/subscribers","subscription_url":"https://api.github.com/repos/mmnc/PowerExtend/subscription","commits_url":"https://api.github.com/repos/mmnc/PowerExtend/commits{/sha}","git_commits_url":"https://api.github.com/repos/mmnc/PowerExtend/git/commits{/sha}","comments_url":"https://api.github.com/repos/mmnc/PowerExtend/comments{/number}","issue_comment_url":"https://api.github.com/repos/mmnc/PowerExtend/issues/comments{/number}","contents_url":"https://api.github.com/repos/mmnc/PowerExtend/contents/{+path}","compare_url":"https://api.github.com/repos/mmnc/PowerExtend/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mmnc/PowerExtend/merges","archive_url":"https://api.github.com/repos/mmnc/PowerExtend/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mmnc/PowerExtend/downloads","issues_url":"https://api.github.com/repos/mmnc/PowerExtend/issues{/number}","pulls_url":"https://api.github.com/repos/mmnc/PowerExtend/pulls{/number}","milestones_url":"https://api.github.com/repos/mmnc/PowerExtend/milestones{/number}","notifications_url":"https://api.github.com/repos/mmnc/PowerExtend/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mmnc/PowerExtend/labels{/name}","releases_url":"https://api.github.com/repos/mmnc/PowerExtend/releases{/id}","deployments_url":"https://api.github.com/repos/mmnc/PowerExtend/deployments","created_at":"2016-03-04T08:06:21Z","updated_at":"2016-03-04T08:06:21Z","pushed_at":"2016-03-05T15:19:20Z","git_url":"git://github.com/mmnc/PowerExtend.git","ssh_url":"git@github.com:mmnc/PowerExtend.git","clone_url":"https://github.com/mmnc/PowerExtend.git","svn_url":"https://github.com/mmnc/PowerExtend","homepage":null,"size":15,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"mmnc:master","ref":"master","sha":"d8432a02b914d6bf3bee82b297d11f882dba339f","user":{"login":"mmnc","id":17543293,"avatar_url":"https://avatars.githubusercontent.com/u/17543293?v=3","gravatar_id":"","url":"https://api.github.com/users/mmnc","html_url":"https://github.com/mmnc","followers_url":"https://api.github.com/users/mmnc/followers","following_url":"https://api.github.com/users/mmnc/following{/other_user}","gists_url":"https://api.github.com/users/mmnc/gists{/gist_id}","starred_url":"https://api.github.com/users/mmnc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mmnc/subscriptions","organizations_url":"https://api.github.com/users/mmnc/orgs","repos_url":"https://api.github.com/users/mmnc/repos","events_url":"https://api.github.com/users/mmnc/events{/privacy}","received_events_url":"https://api.github.com/users/mmnc/received_events","type":"Organization","site_admin":false},"repo":{"id":53118631,"name":"PowerExtend","full_name":"mmnc/PowerExtend","owner":{"login":"mmnc","id":17543293,"avatar_url":"https://avatars.githubusercontent.com/u/17543293?v=3","gravatar_id":"","url":"https://api.github.com/users/mmnc","html_url":"https://github.com/mmnc","followers_url":"https://api.github.com/users/mmnc/followers","following_url":"https://api.github.com/users/mmnc/following{/other_user}","gists_url":"https://api.github.com/users/mmnc/gists{/gist_id}","starred_url":"https://api.github.com/users/mmnc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mmnc/subscriptions","organizations_url":"https://api.github.com/users/mmnc/orgs","repos_url":"https://api.github.com/users/mmnc/repos","events_url":"https://api.github.com/users/mmnc/events{/privacy}","received_events_url":"https://api.github.com/users/mmnc/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mmnc/PowerExtend","description":"Extension commands that makes Powershell more...powerful","fork":false,"url":"https://api.github.com/repos/mmnc/PowerExtend","forks_url":"https://api.github.com/repos/mmnc/PowerExtend/forks","keys_url":"https://api.github.com/repos/mmnc/PowerExtend/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mmnc/PowerExtend/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mmnc/PowerExtend/teams","hooks_url":"https://api.github.com/repos/mmnc/PowerExtend/hooks","issue_events_url":"https://api.github.com/repos/mmnc/PowerExtend/issues/events{/number}","events_url":"https://api.github.com/repos/mmnc/PowerExtend/events","assignees_url":"https://api.github.com/repos/mmnc/PowerExtend/assignees{/user}","branches_url":"https://api.github.com/repos/mmnc/PowerExtend/branches{/branch}","tags_url":"https://api.github.com/repos/mmnc/PowerExtend/tags","blobs_url":"https://api.github.com/repos/mmnc/PowerExtend/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mmnc/PowerExtend/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mmnc/PowerExtend/git/refs{/sha}","trees_url":"https://api.github.com/repos/mmnc/PowerExtend/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mmnc/PowerExtend/statuses/{sha}","languages_url":"https://api.github.com/repos/mmnc/PowerExtend/languages","stargazers_url":"https://api.github.com/repos/mmnc/PowerExtend/stargazers","contributors_url":"https://api.github.com/repos/mmnc/PowerExtend/contributors","subscribers_url":"https://api.github.com/repos/mmnc/PowerExtend/subscribers","subscription_url":"https://api.github.com/repos/mmnc/PowerExtend/subscription","commits_url":"https://api.github.com/repos/mmnc/PowerExtend/commits{/sha}","git_commits_url":"https://api.github.com/repos/mmnc/PowerExtend/git/commits{/sha}","comments_url":"https://api.github.com/repos/mmnc/PowerExtend/comments{/number}","issue_comment_url":"https://api.github.com/repos/mmnc/PowerExtend/issues/comments{/number}","contents_url":"https://api.github.com/repos/mmnc/PowerExtend/contents/{+path}","compare_url":"https://api.github.com/repos/mmnc/PowerExtend/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mmnc/PowerExtend/merges","archive_url":"https://api.github.com/repos/mmnc/PowerExtend/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mmnc/PowerExtend/downloads","issues_url":"https://api.github.com/repos/mmnc/PowerExtend/issues{/number}","pulls_url":"https://api.github.com/repos/mmnc/PowerExtend/pulls{/number}","milestones_url":"https://api.github.com/repos/mmnc/PowerExtend/milestones{/number}","notifications_url":"https://api.github.com/repos/mmnc/PowerExtend/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mmnc/PowerExtend/labels{/name}","releases_url":"https://api.github.com/repos/mmnc/PowerExtend/releases{/id}","deployments_url":"https://api.github.com/repos/mmnc/PowerExtend/deployments","created_at":"2016-03-04T08:06:21Z","updated_at":"2016-03-04T08:06:21Z","pushed_at":"2016-03-05T15:19:20Z","git_url":"git://github.com/mmnc/PowerExtend.git","ssh_url":"git@github.com:mmnc/PowerExtend.git","clone_url":"https://github.com/mmnc/PowerExtend.git","svn_url":"https://github.com/mmnc/PowerExtend","homepage":null,"size":15,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mmnc/PowerExtend/pulls/1"},"html":{"href":"https://github.com/mmnc/PowerExtend/pull/1"},"issue":{"href":"https://api.github.com/repos/mmnc/PowerExtend/issues/1"},"comments":{"href":"https://api.github.com/repos/mmnc/PowerExtend/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/mmnc/PowerExtend/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/mmnc/PowerExtend/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mmnc/PowerExtend/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/mmnc/PowerExtend/statuses/6fe2831b34661de452ad66bb9c804588ea6e4f82"}},"merged":false,"mergeable":null,"mergeable_state":"unknown","merged_by":null,"comments":0,"review_comments":0,"commits":3,"additions":331,"deletions":0,"changed_files":1}}