Skip to content

Commit b0577cb

Browse files
authored
Add option to configure Certificate Endpoint and fix recorded tests (#30399)
1 parent 2a66c8e commit b0577cb

28 files changed

+1326
-6869
lines changed

sdk/confidentialledger/Azure.Security.ConfidentialLedger/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
### Features Added
66

7+
- Added the `CertificateEndpoint` property to `ConfidentialLedgerClientOptions` to allow configuration of a custom certificate endpoint. When not configured, the current default is used.
8+
79
### Breaking Changes
810

911
### Bugs Fixed

sdk/confidentialledger/Azure.Security.ConfidentialLedger/api/Azure.Security.ConfidentialLedger.netstandard2.0.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public ConfidentialLedgerClient(System.Uri ledgerEndpoint, System.Security.Crypt
4040
public partial class ConfidentialLedgerClientOptions : Azure.Core.ClientOptions
4141
{
4242
public ConfidentialLedgerClientOptions(Azure.Security.ConfidentialLedger.ConfidentialLedgerClientOptions.ServiceVersion version = Azure.Security.ConfidentialLedger.ConfidentialLedgerClientOptions.ServiceVersion.V2022_05_13) { }
43+
public System.Uri CertificateEndpoint { get { throw null; } set { } }
4344
public enum ServiceVersion
4445
{
4546
V2022_05_13 = 1,

sdk/confidentialledger/Azure.Security.ConfidentialLedger/src/ConfidentialLedgerClient.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ namespace Azure.Security.ConfidentialLedger
1616
[CodeGenSuppress("PostLedgerEntryAsync", typeof(RequestContent), typeof(string), typeof(RequestContext))]
1717
public partial class ConfidentialLedgerClient
1818
{
19+
private const string Default_Certificate_Endpoint = "https://identity.confidential-ledger.core.azure.com";
20+
1921
/// <summary> Initializes a new instance of ConfidentialLedgerClient. </summary>
2022
/// <param name="ledgerEndpoint"> The Confidential Ledger URL, for example https://contoso.confidentialledger.azure.com. </param>
2123
/// <param name="credential"> A credential used to authenticate to an Azure Service. </param>
@@ -60,7 +62,7 @@ internal ConfidentialLedgerClient(Uri ledgerEndpoint, TokenCredential credential
6062
throw new ArgumentNullException(nameof(credential));
6163
}
6264
var actualOptions = ledgerOptions ?? new ConfidentialLedgerClientOptions();
63-
X509Certificate2 serviceCert = identityServiceCert ?? GetIdentityServerTlsCert(ledgerEndpoint, certificateClientOptions ?? new ConfidentialLedgerCertificateClientOptions()).Cert;
65+
X509Certificate2 serviceCert = identityServiceCert ?? GetIdentityServerTlsCert(ledgerEndpoint, certificateClientOptions ?? new ConfidentialLedgerCertificateClientOptions(), ledgerOptions: ledgerOptions).Cert;
6466

6567
var transportOptions = GetIdentityServerTlsCertAndTrust(serviceCert);
6668
if (clientCertificate != null)
@@ -173,9 +175,9 @@ public virtual async Task<Operation> PostLedgerEntryAsync(
173175
}
174176
}
175177

176-
internal static (X509Certificate2 Cert, string PEM) GetIdentityServerTlsCert(Uri ledgerUri, ConfidentialLedgerCertificateClientOptions options, ConfidentialLedgerCertificateClient client = null)
178+
internal static (X509Certificate2 Cert, string PEM) GetIdentityServerTlsCert(Uri ledgerUri, ConfidentialLedgerCertificateClientOptions options, ConfidentialLedgerCertificateClient client = null, ConfidentialLedgerClientOptions ledgerOptions = null)
177179
{
178-
var identityClient = client ?? new ConfidentialLedgerCertificateClient(new Uri("https://identity.confidential-ledger.core.azure.com"), options);
180+
var identityClient = client ?? new ConfidentialLedgerCertificateClient(ledgerOptions?.CertificateEndpoint ?? new Uri(Default_Certificate_Endpoint), options);
179181

180182
// Get the ledger's TLS certificate for our ledger.
181183
var ledgerId = ledgerUri.Host.Substring(0, ledgerUri.Host.IndexOf('.'));
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
using System;
5+
using Azure.Core;
6+
7+
namespace Azure.Security.ConfidentialLedger
8+
{
9+
public partial class ConfidentialLedgerClientOptions : ClientOptions
10+
{
11+
/// <summary>
12+
/// The Identity Service URL. If not provided, the default endpoint "https://identity.confidential-ledger.core.azure.com" will be used.
13+
/// </summary>
14+
/// <value></value>
15+
public Uri CertificateEndpoint { get; set; }
16+
}
17+
}

sdk/confidentialledger/Azure.Security.ConfidentialLedger/tests/ConfidentialLedgerClientLiveTests.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
namespace Azure.Security.ConfidentialLedger.Tests
1818
{
19-
[LiveOnly]
2019
public class ConfidentialLedgerClientLiveTests : RecordedTestBase<ConfidentialLedgerEnvironment>
2120
{
2221
private TokenCredential Credential;
@@ -37,10 +36,13 @@ public async Task Setup()
3736
Credential = TestEnvironment.Credential;
3837
IdentityClient = new ConfidentialLedgerCertificateClient(
3938
TestEnvironment.ConfidentialLedgerIdentityUrl,
40-
new());
39+
InstrumentClientOptions(new ConfidentialLedgerCertificateClientOptions()));
4140

4241
serviceCert = ConfidentialLedgerClient.GetIdentityServerTlsCert(TestEnvironment.ConfidentialLedgerUrl, new(), IdentityClient);
43-
await SetProxyOptionsAsync(new ProxyOptions { Transport = new ProxyOptionsTransport { TLSValidationCert = serviceCert.PEM, AllowAutoRedirect = true } });
42+
43+
if (Mode != RecordedTestMode.Playback)
44+
await SetProxyOptionsAsync(new ProxyOptions { Transport = new ProxyOptionsTransport { TLSValidationCert = serviceCert.PEM, AllowAutoRedirect = true } });
45+
4446
Client = InstrumentClient(
4547
new ConfidentialLedgerClient(
4648
TestEnvironment.ConfidentialLedgerUrl,
@@ -212,6 +214,7 @@ public async Task CreateAndGetAndDeleteUser()
212214
}
213215

214216
[RecordedTest]
217+
[LiveOnly]
215218
public async Task GetLedgerIdentity()
216219
{
217220
var ledgerId = TestEnvironment.ConfidentialLedgerUrl.Host;

sdk/confidentialledger/Azure.Security.ConfidentialLedger/tests/ConfidentialLedgerClientTests.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,5 +60,36 @@ public async Task FailedTransaction()
6060
async () => await operation.WaitForCompletionResponseAsync());
6161
Assert.That(ex.Message, Does.Contain(transactionId));
6262
}
63+
64+
[Test]
65+
public void CustomCertUri()
66+
{
67+
Uri customUri = new Uri("http://my-custom-uri.com");
68+
69+
var client = InstrumentClient(
70+
new ConfidentialLedgerClient(
71+
new("https://client.name"),
72+
new MockCredential(),
73+
ledgerOptions: new ConfidentialLedgerClientOptions
74+
{
75+
CertificateEndpoint = customUri,
76+
},
77+
certificateClientOptions: new ConfidentialLedgerCertificateClientOptions
78+
{
79+
Retry = { Delay = TimeSpan.Zero, MaxRetries = 0 },
80+
Transport = new MockTransport(
81+
req =>
82+
{
83+
Assert.AreEqual(customUri.Host, req.Uri.Host);
84+
var cert = new MockResponse(200);
85+
cert.SetContent(
86+
@" {
87+
""ledgerTlsCertificate"": ""-----BEGIN CERTIFICATE-----\nMIIBejCCASGgAwIBAgIRANPpW17pcDYr1KnqsJH5yC8wCgYIKoZIzj0EAwIwFjEU\nMBIGA1UEAwwLQ0NGIE5ldHdvcmswHhcNMjEwMzExMDAwMDAwWhcNMjMwNjExMjM1\nOTU5WjAWMRQwEgYDVQQDDAtDQ0YgTmV0d29yazBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABOCPGnfcmfm5Vyax3bvg5Xqg6RUZtda0U5qpmxqGgLfL3LYJd3heTPd\u002B\n51o29pMtKJGG4cWeZ3\u002BYbhZzHnetf8WjUDBOMAwGA1UdEwQFMAMBAf8wHQYDVR0O\nBBYEFFxq\u002BImyEVh4u4BfynwnEAsbvRJBMB8GA1UdIwQYMBaAFFxq\u002BImyEVh4u4Bf\nynwnEAsbvRJBMAoGCCqGSM49BAMCA0cAMEQCIC597R3C89/IzfqjkO31XKy4Rnfy\nXauWszBChtH1v2CoAiAS0tmFNjD3fweHH8O2ySXK/tPCBTq877pIjFGwvuj2uw==\n-----END CERTIFICATE-----\n\u0000"",
88+
""ledgerId"": ""chrissconfidentialledger""}");
89+
return cert;
90+
})
91+
}
92+
));
93+
}
6394
}
6495
}

sdk/confidentialledger/Azure.Security.ConfidentialLedger/tests/SessionRecords/ConfidentialLedgerClientLiveTests/CreateAndGetAndDeleteUser.json

Lines changed: 49 additions & 22 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)