Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Release History

## 4.0.1 (Unreleased)

### Fixed

- Reset challenge cache so tests can be run individually and in any order. (#9356)[https://github.com/Azure/azure-sdk-for-net/issues/9356]
- Properly import PKCS12 or PEM-encoded certificate. (#9963)[https://github.com/Azure/azure-sdk-for-net/issues/9963]
- Serialize the `MergeCertificateOptions` in `CertificateClient.MergeCertificate`. (#9986)[https://github.com/Azure/azure-sdk-for-net/issues/9986]

## 4.0.0 (2019-01-08)

### Minor changes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<PropertyGroup>
<Description>This is the Microsoft Azure Key Vault Certificates client library</Description>
<AssemblyTitle>Microsoft Azure.Security.KeyVault.Certificates client library</AssemblyTitle>
<Version>4.0.0</Version>
<Version>4.0.1</Version>
<PackageTags>Microsoft Azure Key Vault Certificates;$(PackageCommonTags)</PackageTags>
<TargetFrameworks>$(RequiredTargetFrameworks)</TargetFrameworks>
<NoWarn>$(NoWarn);3021</NoWarn>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -662,7 +662,7 @@ public virtual async Task<Response<KeyVaultCertificateWithPolicy>> RestoreCertif
}

/// <summary>
/// Imports a pre-existing certificate to the key vault. The specified certificate must be in PFX or PEM format, and must contain the private key as well as the X.509 certificates. This operation requires the
/// Imports a pre-existing certificate to the key vault. The specified certificate must be in PFX or ASCII PEM format, and must contain the private key as well as the X.509 certificates. This operation requires the
/// certificates/import permission.
/// </summary>
/// <param name="importCertificateOptions">The details of the certificate to import to the key vault.</param>
Expand Down Expand Up @@ -691,7 +691,7 @@ public virtual Response<KeyVaultCertificateWithPolicy> ImportCertificate(ImportC
}

/// <summary>
/// Imports a pre-existing certificate to the key vault. The specified certificate must be in PFX or PEM format, and must contain the private key as well as the X.509 certificates. This operation requires the
/// Imports a pre-existing certificate to the key vault. The specified certificate must be in PFX or ASCII PEM format, and must contain the private key as well as the X.509 certificates. This operation requires the
/// certificates/import permission.
/// </summary>
/// <param name="importCertificateOptions">The details of the certificate to import to the key vault.</param>
Expand Down Expand Up @@ -1412,7 +1412,7 @@ public virtual Response<KeyVaultCertificateWithPolicy> MergeCertificate(MergeCer

try
{
Response<KeyVaultCertificateWithPolicy> certificate = _pipeline.SendRequest(RequestMethod.Post, () => new KeyVaultCertificateWithPolicy(), cancellationToken, CertificatesPath, mergeCertificateOptions.Name, "/pending/merge");
Response<KeyVaultCertificateWithPolicy> certificate = _pipeline.SendRequest(RequestMethod.Post, mergeCertificateOptions, () => new KeyVaultCertificateWithPolicy(), cancellationToken, CertificatesPath, mergeCertificateOptions.Name, "/pending/merge");

return Response.FromValue(certificate.Value, certificate.GetRawResponse());
}
Expand Down Expand Up @@ -1440,7 +1440,7 @@ public virtual async Task<Response<KeyVaultCertificateWithPolicy>> MergeCertific

try
{
Response<KeyVaultCertificateWithPolicy> certificate = await _pipeline.SendRequestAsync(RequestMethod.Post, () => new KeyVaultCertificateWithPolicy(), cancellationToken, CertificatesPath, mergeCertificateOptions.Name, "/pending/merge").ConfigureAwait(false);
Response<KeyVaultCertificateWithPolicy> certificate = await _pipeline.SendRequestAsync(RequestMethod.Post, mergeCertificateOptions, () => new KeyVaultCertificateWithPolicy(), cancellationToken, CertificatesPath, mergeCertificateOptions.Name, "/pending/merge").ConfigureAwait(false);

return Response.FromValue(certificate.Value, certificate.GetRawResponse());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,7 @@ void IJsonDeserializable.ReadProperties(JsonElement json)
break;

case CsrPropertyName:
string csr = prop.Value.GetString();
Csr = Base64Url.Decode(csr);
Csr = prop.Value.GetBytesFromBase64();
break;

case CancellationRequestedPropertyName:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.Json;
using System.Threading;
using Azure.Core;
Expand All @@ -27,7 +28,7 @@ public class ImportCertificateOptions : IJsonSerializable
/// Initializes a new instance of the <see cref="ImportCertificateOptions"/> class.
/// </summary>
/// <param name="name">A name for the imported certificate.</param>
/// <param name="certificate">The PFX or PEM formatted value of the certificate containing both the X.509 certificates and the private key.</param>
/// <param name="certificate">The PFX or ASCII PEM formatted value of the certificate containing both the X.509 certificates and the private key.</param>
/// <exception cref="ArgumentException"><paramref name="name"/> is empty.</exception>
/// <exception cref="ArgumentNullException"><paramref name="name"/> or <paramref name="certificate"/> is null.</exception>
public ImportCertificateOptions(string name, byte[] certificate)
Expand Down Expand Up @@ -73,8 +74,15 @@ void IJsonSerializable.WriteProperties(Utf8JsonWriter json)
{
if (Certificate != null)
{
string encoded = Base64Url.Encode(Certificate);
json.WriteString(s_valuePropertyNameBytes, encoded);
if (Policy != null && Policy.ContentType == CertificateContentType.Pem)
{
string value = Encoding.ASCII.GetString(Certificate);
json.WriteString(s_valuePropertyNameBytes, value);
}
else
{
json.WriteBase64String(s_valuePropertyNameBytes, Certificate);
}
}

if (!string.IsNullOrEmpty(Password))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ internal virtual void ReadProperty(JsonProperty prop)
break;

case CERPropertyName:
Cer = Base64Url.Decode(prop.Value.GetString());
Cer = prop.Value.GetBytesFromBase64();
break;

default:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,7 @@ void IJsonSerializable.WriteProperties(Utf8JsonWriter json)

foreach (byte[] x509certificate in X509Certificates)
{
string encoded = Base64Url.Encode(x509certificate);
json.WriteStringValue(encoded);
json.WriteBase64StringValue(x509certificate);
}

json.WriteEndArray();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@
<Import Project="..\..\..\core\Azure.Core\tests\TestFramework.props" />
<Import Project="..\..\Azure.Security.KeyVault.Shared\tests\Azure.Security.KeyVault.Shared.Tests.projitems" Label="Shared" />

<ItemGroup>
<Compile Update="CertificateClientLiveTests.Constants.cs">
<DependentUpon>CertificateClientLiveTests.cs</DependentUpon>
</Compile>
</ItemGroup>

<ItemGroup>
<PackageReference Include="Azure.Identity" />
<PackageReference Include="nunit" />
Expand All @@ -15,6 +21,7 @@
<PackageReference Include="Moq" />
<PackageReference Include="BenchmarkDotNet" />
<PackageReference Include="System.Text.Json" />
<PackageReference Include="Portable.BouncyCastle" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

namespace Azure.Security.KeyVault.Certificates.Tests
{
public partial class CertificateClientLiveTests
{
private const string CaPublicKeyBase64 =
"MIIDqzCCApMCFC+MROpib4t03Wqzgkcod1lad6JtMA0GCSqGSIb3DQEBCwUAMIGR" +
"MQswCQYDVQQGEwJVUzELMAkGA1UECAwCV0ExEDAOBgNVBAcMB1JlZG1vbmQxEjAQ" +
"BgNVBAoMCU1pY3Jvc29mdDESMBAGA1UECwwJQXp1cmUgU0RLMRIwEAYDVQQDDAlB" +
"enVyZSBTREsxJzAlBgkqhkiG9w0BCQEWGG9wZW5zb3VyY2VAbWljcm9zb2Z0LmNv" +
"bTAeFw0yMDAyMTQyMzE3MTZaFw0yNTAyMTIyMzE3MTZaMIGRMQswCQYDVQQGEwJV" +
"UzELMAkGA1UECAwCV0ExEDAOBgNVBAcMB1JlZG1vbmQxEjAQBgNVBAoMCU1pY3Jv" +
"c29mdDESMBAGA1UECwwJQXp1cmUgU0RLMRIwEAYDVQQDDAlBenVyZSBTREsxJzAl" +
"BgkqhkiG9w0BCQEWGG9wZW5zb3VyY2VAbWljcm9zb2Z0LmNvbTCCASIwDQYJKoZI" +
"hvcNAQEBBQADggEPADCCAQoCggEBANwCTuK0OnFc8UytzzCIB5pUWqWCMZA8kWO1" +
"Es84wOVupPTZHNDWKI57prj0CB5JP2yU8BkIFjhkV/9wc2KLjKwu7xaJTwBZF/i0" +
"t8dPBbgiEUmK6xdbJsLXoef/XZ5AmvCKb0mimEMvL8KgeF5OHuZJuYO0zCiRNVtp" +
"ZYSx2R73qhgy5klDHh346qQd5T+KbsdK3DArilT86QO1GrpBWl1GPvHJ3VZ1OO33" +
"iFWfyEVgwdAtMAkWXH8Eh1/MpPE8WQk5X5pdVEu+RJLLrVbgr+cnlVzfirSVLRar" +
"KZROAB3e2x8JdSqylnar/WWK11NERdiKaZr3WxAkceuVkTsKmRkCAwEAATANBgkq" +
"hkiG9w0BAQsFAAOCAQEAYLfk2dBcW1mJbkVYx80ogDUy/xX3d+uuop2gZwUXuzWY" +
"I4uXzSEsY37/+NKzOX6PtET3X6xENDW7AuJhTuWmTGZtPB1AjiVKLIgRwugV3Ovr" +
"1DoPBIvS7iCHGGcsr7tAgYxiVATlIcczCxQG1KPhrrLSUDxkbiyUHpyroExHGBeC" +
"UflT2BIO+TZ+44aYfO7vuwpu0ajfB6Rs0s/DM+uUTWCfsVvyPenObHz5HF2vxf75" +
"y8pr3fYKuUvpJ45T0ZjiXyRpkBTDudU3vuYuyAP3PwO6F/ic7Rm9D1uzEI38Va+o" +
"6CUh4NJnpIZIBs7T+rPwhKrUuM7BEO0CL7VTh37UzA==";

private const string CaPrivateKeyPem =
"-----BEGIN RSA PRIVATE KEY-----\n" +
"MIIEowIBAAKCAQEA3AJO4rQ6cVzxTK3PMIgHmlRapYIxkDyRY7USzzjA5W6k9Nkc\n" +
"0NYojnumuPQIHkk/bJTwGQgWOGRX/3BzYouMrC7vFolPAFkX+LS3x08FuCIRSYrr\n" +
"F1smwteh5/9dnkCa8IpvSaKYQy8vwqB4Xk4e5km5g7TMKJE1W2llhLHZHveqGDLm\n" +
"SUMeHfjqpB3lP4pux0rcMCuKVPzpA7UaukFaXUY+8cndVnU47feIVZ/IRWDB0C0w\n" +
"CRZcfwSHX8yk8TxZCTlfml1US75EksutVuCv5yeVXN+KtJUtFqsplE4AHd7bHwl1\n" +
"KrKWdqv9ZYrXU0RF2IppmvdbECRx65WROwqZGQIDAQABAoIBADEX0sKDtQbW1oFl\n" +
"x3Xs5MVrTU7hXm3xFgBJx4i2AVUw+14nlGaFY0doECv1SFp5vc1c7ranN04eFgTJ\n" +
"8vVqbll9n5xHx3ksaEz3BotS9tO/xlvCw/LSRDP2Kgq60QkfIXPLcEneHlvfi6jC\n" +
"ZhmlFQAOM3dQQL5MqLtdKWoSxYBDGZ5WMTs89Cq54jSHUMYcH2l2WFM1+aKCWLYG\n" +
"O+L50jh0IXqUbeR2PQe4meo5v97pQGiZ3zW0PGA2E0tEfjhr/EV1P4ywpufkz8Md\n" +
"FxcGer0bVsFlFMYS1e+0XvRj9cSMfVZ2JvVt0cjpvyg/ZHkDE1ik9GyxgfHwupI9\n" +
"pr244AECgYEA84ebMu6vUQPhqqawvPGlJpGkzFzWoTzzyaCzn5Sf/kJTremGVCJ+\n" +
"eb5onFbLxc6/YW8XU1u2kEvdYgLtObMBMpbbEdJsuxV7B2ZzeEgXLdhYpgMzC01k\n" +
"K9dLyy0aEkeQjaVHaFxlhTgGtyyq2WjyRDNYQN4dlw32exrcY4OMqSECgYEA50Zf\n" +
"aRsHfNzJKMU+AombzW73QYOJV5R3ACaGfTn6Dnsvu1kbDhbDL0GqV3/iZb4sT9JX\n" +
"RAl2csYn7ML35okdqKmE3kWyE3Xq4JsIw4zee9VItJbOR8AgRPv4maDZkCOSDQD6\n" +
"rEDF8FtK8eGDVx25bCdKk/t8hTVjhZukkzB/GPkCgYBWovCYrwdZyAq5XjHUFheN\n" +
"4BSDy6djlz6XhX9Bj2tX1hrU7RYnylm6T/4BWHOH/KRjMlVXB3KsZQDuRGJGu6L6\n" +
"b2aiMX0TFXI+ULlVmjf8zFHFRbAcHj07x40kS/hRdno7mggMXYqUWTkyY0aor8g4\n" +
"cRe9hAd83K/KXeT31i3tYQKBgEiUTib3A4+M3lg8Jiy3sLx0wYW+2OAySHI0pOox\n" +
"wqa+xAkAerweKpzu951EFfGmD9PxB8/jRFfalfb4bMHdcABZSshSiQMQc2iPXt23\n" +
"nK6yDYIW/Z+IzNe5V5gm4YAZmaEZGJHsNfIrREbKZeR2AJXPctkkCDzpt1Tbtnc2\n" +
"tfxJAoGBAJUzMi+mq27SSbMoM1Z/JYCh7lEcKdXMX+oVLlyieesSPyNTmYzInWTN\n" +
"G2Es55ivUhjcZXzWyFfLzYUH4sEerR8hsqUkT/ofTEvROum6F8iDWjgpWaogp9KS\n" +
"PWoiKZdw+hG0+nu/sypY09F5mSXbigZERjH1J4Ik/KFcmjLWVmDz\n" +
"-----END RSA PRIVATE KEY-----\n";

private const string CaKeyPairPkcs12Base64 =
"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";
}
}
Loading