TLS.psm1

[CmdletBinding()]
param()
$baseName = [System.IO.Path]::GetFileNameWithoutExtension($PSCommandPath)
$script:PSModuleInfo = Test-ModuleManifest -Path "$PSScriptRoot\$baseName.psd1"
$script:PSModuleInfo | Format-List | Out-String -Stream | ForEach-Object { Write-Debug $_ }
$scriptName = $script:PSModuleInfo.Name
Write-Debug "[$scriptName] - Importing module"
#region [functions] - [public]
Write-Debug "[$scriptName] - [functions] - [public] - Processing folder"
#region [functions] - [public] - [Get-TLSConfig]
Write-Debug "[$scriptName] - [functions] - [public] - [Get-TLSConfig] - Importing"
function Get-TLSConfig {
    <#
        .SYNOPSIS
        Retrieves the current TLS configuration or lists available TLS versions.

        .DESCRIPTION
        This function returns the currently configured TLS version used by .NET applications.
        If the -ListAvailable parameter is specified, it lists all available TLS versions supported.

        .EXAMPLE
        Get-TLSConfig

        Returns the currently configured TLS version.

        .EXAMPLE
        Get-TLSConfig -ListAvailable

        Lists all available TLS versions that can be configured.

        .LINK
        https://psmodule.io/TLS/Functions/Get-TLSConfig/
    #>

    [OutputType(ParameterSetName = 'Default', [System.Net.SecurityProtocolType])]
    [OutputType(ParameterSetName = 'ListAvailable', [Array])]
    [CmdletBinding(DefaultParameterSetName = 'Default')]
    param(
        # List available TLS configurations
        [Parameter(ParameterSetName = 'ListAvailable')]
        [switch] $ListAvailable
    )

    if ($ListAvailable) {
        return [enum]::GetValues([System.Net.SecurityProtocolType])
    }
    return [System.Net.ServicePointManager]::SecurityProtocol
}
Write-Debug "[$scriptName] - [functions] - [public] - [Get-TLSConfig] - Done"
#endregion [functions] - [public] - [Get-TLSConfig]
#region [functions] - [public] - [Set-TLSConfig]
Write-Debug "[$scriptName] - [functions] - [public] - [Set-TLSConfig] - Importing"
function Set-TLSConfig {
    <#
        .SYNOPSIS
        Configures the system to enable specific TLS protocols.

        .DESCRIPTION
        The Set-TLSConfig function allows enabling one or more TLS protocols by modifying the system's SecurityProtocol settings.
        This function updates the current security protocol settings without removing existing ones.

        .EXAMPLE
        Set-TLSConfig -Protocol Tls12

        Enables TLS 1.2 as a supported security protocol.

        .EXAMPLE
        Set-TLSConfig -Protocol Tls12, Tls13

        Enables both TLS 1.2 and TLS 1.3 as supported security protocols.

        .LINK
        https://psmodule.io/TLS/Functions/Set-TLSConfig/
    #>

    [OutputType([void])]
    [CmdletBinding(SupportsShouldProcess)]
    param(
        # The TLS protocol to enable
        [Parameter(Mandatory)]
        [System.Net.SecurityProtocolType[]] $Protocol
    )

    foreach ($protocolItem in $Protocol) {
        Write-Verbose "Enabling $protocolItem"
        if ($PSCmdlet.ShouldProcess("Security Protocol to [$Protocol]", 'Set')) {
            [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor $protocolItem
        }
    }
}
Write-Debug "[$scriptName] - [functions] - [public] - [Set-TLSConfig] - Done"
#endregion [functions] - [public] - [Set-TLSConfig]
Write-Debug "[$scriptName] - [functions] - [public] - Done"
#endregion [functions] - [public]

#region Member exporter
$exports = @{
    Alias    = '*'
    Cmdlet   = ''
    Function = @(
        'Get-TLSConfig'
        'Set-TLSConfig'
    )
}
Export-ModuleMember @exports
#endregion Member exporter