I have a Sentinel-2 L2A and was able to access it with:
In[1]:
image = gdal.Open(s2l2a_image.zip)
subdatasets = image.GetSubdatasets()
Out[1]:
[('SENTINEL2_L2A:/vsizip/s2l2a_image.zip/S2A_MSIL2A_20190620T100031_N0212_R122_T33UXQ_20190620T131720.SAFE/MTD_MSIL2A.xml:10m:EPSG_32633',
'Bands B2, B3, B4, B8 with 10m resolution, UTM 33N'),
('SENTINEL2_L2A:/vsizip/s2l2a_image.zip/S2A_MSIL2A_20190620T100031_N0212_R122_T33UXQ_20190620T131720.SAFE/MTD_MSIL2A.xml:20m:EPSG_32633',
'Bands B5, B6, B7, B8A, B11, B12 with 20m resolution, UTM 33N'),
('SENTINEL2_L2A:/vsizip/s2l2a_image.zip/S2A_MSIL2A_20190620T100031_N0212_R122_T33UXQ_20190620T131720.SAFE/MTD_MSIL2A.xml:60m:EPSG_32633',
'Bands B1, B9 with 60m resolution, UTM 33N'),
('SENTINEL2_L2A:/vsizip/s2l2a_image.zip/S2A_MSIL2A_20190620T100031_N0212_R122_T33UXQ_20190620T131720.SAFE/MTD_MSIL2A.xml:TCI:EPSG_32633',
'True color image, UTM 33N')]
This is great, however, official GDAL documentation for Sentinel-2 driver (here) talks about L2A-specific layers, such as Scene Classification Layer (SCL) and others. I tried a lot, inspected subdatasets and such, but found no way to access them.